当前位置: 首页 > 知识库问答 >
问题:

Google Sheets API: Go语言BatchUpdateValues请求

袁俊弼
2023-03-14

我试图遵循Google Sheets API快速入门:

https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/batchUpdate

(向下滚动到示例,然后单击GO)

以下是我尝试更新电子表格的方式:

package main

// BEFORE RUNNING:
// ---------------
// 1. If not already done, enable the Google Sheets API
//    and check the quota for your project at
//    https://console.developers.google.com/apis/api/sheets
// 2. Install and update the Go dependencies by running `go get -u` in     the
//    project directory.

import (
        "errors"
        "fmt"
        "log"
        "net/http"

        "golang.org/x/net/context"
        "google.golang.org/api/sheets/v4"
)

func main() {
        ctx := context.Background()

        c, err := getClient(ctx)
        if err != nil {
                log.Fatal(err)
        }

        sheetsService, err := sheets.New(c)
        if err != nil {
                log.Fatal(err)
        }

        // The ID of the spreadsheet to update.
        spreadsheetId := "1diQ943LGMDNkbCRGG4VqgKZdzyanCtT--V8o7r6kCR0"
        var jsonPayloadVar []string
        monthVar := "Apr"
        thisCellVar := "A26"
        thisLinkVar := "http://test.url"
        jsonRackNumberVar := "\"RACKNUM01\""
        jsonPayloadVar = append(jsonPayloadVar, fmt.Sprintf("(\"range\":     \"%v!%v\", \"values\": [[\"%v,%v)\"]]),", monthVar, thisCellVar, thisLinkVar,     jsonRackNumberVar))

        rb := &sheets.BatchUpdateValuesRequest{"ValueInputOption":     "USER_ENTERED", "data": jsonPayloadVar}
        resp, err :=     sheetsService.Spreadsheets.Values.BatchUpdate(spreadsheetId,     rb).Context(ctx).Do()
        if err != nil {
                log.Fatal(err)
        }

        fmt.Printf("%#v\n", resp)
}

func getClient(ctx context.Context) (*http.Client, error) {
        //     https://developers.google.com/sheets/quickstart/go#step_3_set_up_the_sample
        //
        // Authorize using the following scopes:
        //     sheets.DriveScope
        //     sheets.DriveFileScope
             sheets.SpreadsheetsScope
        return nil, errors.New("not implemented")
}

输出:

hello.go:43:结构初始化器中无效的字段名ValueInputOption
hello.go:43:结构初始化器
hello.go:58:表中无效的字段名data。电子表格范围已评估但未使用

有两件事不起作用:

  1. 不清楚如何将字段输入变量rb
  2. 我需要用床单。电子表格范围

有人能提供一个执行批处理更新的工作示例吗?

参考文献:本文展示了如何做一个不是BatchUpdate的更新:Golang google sheets API V4-编写/更新示例?

Google的API参考-请参阅从第1437行开始的ValueInputOption部分:https://github.com/google/google-api-go-client/blob/master/sheets/v4/sheets-gen.go

本文展示了如何用Java进行批处理更新:使用GoogleSheetAPIv4-Java示例代码将数据写入GoogleSheet

共有1个答案

高慈
2023-03-14

下面的示例脚本怎么样?这是一个简单的示例脚本,用于更新电子表格上的工作表。所以如果你想做各种更新,请修改它。spreadsheets.values.batch更新的详细参数如下。

首先,为了使用问题中的链接,请使用Go Quickstart。在我的示例脚本中,脚本是使用Quickstart创建的。

使用此示例脚本的流程如下。

  1. 对于Go快速入门,请执行步骤1和步骤2。
  2. 请把client_secret.json放在与我的示例脚本相同的目录中。
  3. 复制并粘贴我的示例脚本,并将其创建为新脚本文件。
  4. 运行脚本。
  5. 在您的浏览器中转到以下链接,然后键入授权代码:显示在您的终端上,请复制网址并粘贴到您的浏览器。然后,请授权并获取代码
  6. 把代码输入终端。
  7. Done.显示时,表示电子表格的更新已经完成。

对于电子表格。价值观BatchUpdateBatchUpdateValuesRequest是必需的参数之一。在本例中,要更新的范围、值等包含在BatchUpdateValuesRequest中。此BatchUpdateValuesRequest的详细信息可在godoc查看。当它看到BatchUpdateValuesRequest时,可以看到数据[]*ValueRange。在这里,请注意数据[]*值范围。在godoc也可以看到ValueRange。您可以在ValueRange中查看MajorDimensionRangeValues

当以上信息反映到脚本中时,可以对脚本进行如下修改。

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.")
}
  • spreadsheets.values.batchUpdate的详细信息在这里。
  • Go快速入门的详细信息在这里。
  • BatchUpdateValuesRequest的详细信息在这里。
  • ValueRange的详细信息在这里。

如果我误解了你的问题,我很抱歉。

 类似资料:
  • vue3的多语言如何改成异步按需请求语言文件?

  • 解决方案: 我为我的api请求准备了这段代码,当我使用调试器时,它可以工作。 我可以在PlayerStats课程中看到结果,但现在我遇到了一个问题。 但是在这个不工作: 统计数据。课程: 我需要一种从 不工作,因为零参数。 如果我试图修复: IDE说它需要一个或一个断言调用,但如果我尝试使用断言调用,应用程序就会崩溃,我会得到以下错误: 2020-03-05 18:58:02.803 23276-

  • 概述 javascript csharp cpp json html php python markdown typescript css dockerfile

  • 当您设置 A370 时,您可从以下语言选择一种您要使用的语言: 英语 西班牙语 葡萄牙语 芬兰语 丹麦语 德语 瑞典语 挪威语 德语 意大利语 芬兰语 波兰语 俄语 简体中文 日语 印尼语 土耳其语 捷克语 韩语 在设置后,您可在 Flow 应用程式或网络服务中变更语言。

  • 我想发送一个请求,使用Flurl指定内容头。我已经成功地设置了内容类型(),没有任何问题: 正确返回: 所使用的API是一个模拟。我知道使用会自动设置头,但是,对于我的用例,它将被设置为,因此需要显式指定。 我做错了什么?关于内容头,我有什么不明白的吗? 与在添加到请求时有什么不同?

  • 程序员用各种编程语言编写指令,有些是计算机直接理解的,有些则需要中间翻译(tranlation)的步骤。如今使用的计算机语言有几百种,可以分为三大类: 机器语言 汇编语言 高级语言 任何计算机只能直接理解本身酌机器语言(machine language)。机器语言是特定计算机的自然语言,由计算机的硬件设计定义。机器语言通常由一系列数字组成(最终简化0和1),让计算机一次一个地执行最基本的操作。机器