Skip to content

Instantly share code, notes, and snippets.

@temamagic
Forked from tanaikech/submit.md
Created November 2, 2019 16:17
Show Gist options
  • Save temamagic/ceb32447c8506466a1c42d288e1ac785 to your computer and use it in GitHub Desktop.
Save temamagic/ceb32447c8506466a1c42d288e1ac785 to your computer and use it in GitHub Desktop.

Revisions

  1. @tanaikech tanaikech revised this gist Sep 15, 2017. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion submit.md
    Original file line number Diff line number Diff line change
    @@ -16,7 +16,7 @@ For ``Spreadsheets.Values.BatchUpdate``, ``BatchUpdateValuesRequest`` is require
    When above infomation is reflected to the script, the script can be modified as follows.

    ## Sample script :
    ~~~
    ~~~golang
    package main

    import (
  2. @tanaikech tanaikech created this gist Sep 15, 2017.
    139 changes: 139 additions & 0 deletions submit.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,139 @@
    # spreadsheets.values.batchUpdate using Golang
    ## Flow :
    In my sample script, the script was made using the Quickstart. The flow to use this sample script is as follows.

    1. For [Go Quickstart](https://developers.google.com/sheets/api/quickstart/go), please do Step 1 and Step 2.
    1. Please put ``client_secret.json`` to the same directory with my sample script.
    1. Copy and paste my sample script, and create it as new script file.
    1. Run the script.
    1. When ``Go to the following link in your browser then type the authorization code:`` is shown on your terminal, please copy the URL and paste to your browser. And then, please authorize and get code.
    1. Put the code to the terminal.
    1. When ``Done.`` is displayed, it means that the update of spreadsheet is done.

    ## Request body :
    For ``Spreadsheets.Values.BatchUpdate``, ``BatchUpdateValuesRequest`` is required as one of parameters. In this case, the range, values and so on that you want to update are included in ``BatchUpdateValuesRequest``. The detail information of this ``BatchUpdateValuesRequest`` can be seen at [godoc](https://godoc.org/google.golang.org/api/sheets/v4#BatchUpdateValuesRequest). When it sees ``BatchUpdateValuesRequest``, ``Data []*ValueRange`` can be seen. Here, please be carefull that ``Data`` is ``[]*ValueRange``. Also ``ValueRange`` can be seen at [godoc](https://godoc.org/google.golang.org/api/sheets/v4#ValueRange). You can see ``MajorDimension``, ``Range`` and ``Values`` in ``ValueRange``.

    When above infomation is reflected to the script, the script can be modified as follows.

    ## Sample script :
    ~~~
    package main
    import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "os"
    "golang.org/x/net/context"
    "golang.org/x/oauth2"
    "golang.org/x/oauth2/google"
    "google.golang.org/api/sheets/v4"
    )
    // getClient uses a Context and Config to retrieve a Token
    // then generate a Client. It returns the generated Client.
    func getClient(ctx context.Context, config *oauth2.Config) *http.Client {
    cacheFile := "./go-quickstart.json"
    tok, err := tokenFromFile(cacheFile)
    if err != nil {
    tok = getTokenFromWeb(config)
    saveToken(cacheFile, tok)
    }
    return config.Client(ctx, tok)
    }
    // getTokenFromWeb uses Config to request a Token.
    // It returns the retrieved Token.
    func getTokenFromWeb(config *oauth2.Config) *oauth2.Token {
    authURL := config.AuthCodeURL("state-token", oauth2.AccessTypeOffline)
    fmt.Printf("Go to the following link in your browser then type the "+
    "authorization code: \n%v\n", authURL)
    var code string
    if _, err := fmt.Scan(&code); err != nil {
    log.Fatalf("Unable to read authorization code %v", err)
    }
    tok, err := config.Exchange(oauth2.NoContext, code)
    if err != nil {
    log.Fatalf("Unable to retrieve token from web %v", err)
    }
    return tok
    }
    // tokenFromFile retrieves a Token from a given file path.
    // It returns the retrieved Token and any read error encountered.
    func tokenFromFile(file string) (*oauth2.Token, error) {
    f, err := os.Open(file)
    if err != nil {
    return nil, err
    }
    t := &oauth2.Token{}
    err = json.NewDecoder(f).Decode(t)
    defer f.Close()
    return t, err
    }
    func saveToken(file string, token *oauth2.Token) {
    fmt.Printf("Saving credential file to: %s\n", file)
    f, err := os.Create(file)
    if err != nil {
    log.Fatalf("Unable to cache oauth token: %v", err)
    }
    defer f.Close()
    json.NewEncoder(f).Encode(token)
    }
    type body struct {
    Data struct {
    Range string `json:"range"`
    Values [][]string `json:"values"`
    } `json:"data"`
    ValueInputOption string `json:"valueInputOption"`
    }
    func main() {
    ctx := context.Background()
    b, err := ioutil.ReadFile("client_secret.json")
    if err != nil {
    log.Fatalf("Unable to read client secret file: %v", err)
    }
    config, err := google.ConfigFromJSON(b, "https://www.googleapis.com/auth/spreadsheets")
    if err != nil {
    log.Fatalf("Unable to parse client secret file to config: %v", err)
    }
    client := getClient(ctx, config)
    sheetsService, err := sheets.New(client)
    if err != nil {
    log.Fatalf("Unable to retrieve Sheets Client %v", err)
    }
    spreadsheetId := "### spreadsheet ID ###"
    rangeData := "sheet1!A1:B3"
    values := [][]interface{}{{"sample_A1", "sample_B1"}, {"sample_A2", "sample_B2"}, {"sample_A3", "sample_A3"}}
    rb := &sheets.BatchUpdateValuesRequest{
    ValueInputOption: "USER_ENTERED",
    }
    rb.Data = append(rb.Data, &sheets.ValueRange{
    Range: rangeData,
    Values: values,
    })
    _, err = sheetsService.Spreadsheets.Values.BatchUpdate(spreadsheetId, rb).Context(ctx).Do()
    if err != nil {
    log.Fatal(err)
    }
    fmt.Println("Done.")
    }
    ~~~

    ### Result :
    ![](https://tanaikech.github.io/img/20170915a-img1.png)

    ## References :
    - The detail infomation of ``spreadsheets.values.batchUpdate`` is [here](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/batchUpdate).
    - The detail infomation of Go Quickstart is [here](https://developers.google.com/sheets/api/quickstart/go).
    - The detail infomation of ``BatchUpdateValuesRequest`` is [here](https://godoc.org/google.golang.org/api/sheets/v4#BatchUpdateValuesRequest).
    - The detail infomation of ``ValueRange`` is [here](https://godoc.org/google.golang.org/api/sheets/v4#ValueRange).