Golang谷歌表格API V4 - 写入/更新示例?

19
尝试使用Go编写简单的三列表格([][]string),但是无法实现。 快速入门指南非常好,我现在可以读取工作表,但没有任何示例说明如何将数据写入工作表,也许这很简单,但对我来说似乎不是。对于我的大脑来说,Golang库太复杂了,无法弄清楚,而且我找不到任何例子...
这个C#示例看起来非常接近,但我不确定我是否清楚地理解了C#。

3
因为你承认有些事情过于复杂,难以理解,所以我给你点赞。有些人似乎认为存在可读的代码就足以证明不需要编写良好的文档,但我不是这样的人。 - Michael
3个回答

25

经过一些尝试,终于有了答案。一切都与https://developers.google.com/sheets/quickstart/go中的相同,只是主要函数发生了变化。

func write() {
    ctx := context.Background()
    b, err := ioutil.ReadFile("./Google_Sheets_API_Quickstart/client_secret.json")
    if err != nil {
       log.Fatalf("Unable to read client secret file: %v", err)
    }

// If modifying these scopes, delete your previously saved credentials
// at ~/.credentials/sheets.googleapis.com-go-quickstart.json
    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)

    srv, err := sheets.New(client)
    if err != nil {
        log.Fatalf("Unable to retrieve Sheets Client %v", err)
    }

    spreadsheetId := "YOUR SPREADSHEET ID"

    writeRange := "A1"

    var vr sheets.ValueRange

    myval := []interface{}{"One", "Two", "Three"}
    vr.Values = append(vr.Values, myval)

    _, err = srv.Spreadsheets.Values.Update(spreadsheetId, writeRange, &vr).ValueInputOption("RAW").Do()
    if err != nil {
        log.Fatalf("Unable to retrieve data from sheet. %v", err)
    }

}

8
如果你正在寻求基于服务账户的认证,那么以下内容对我起到了帮助。
https://console.developers.google.com下载服务账户的客户端密钥文件。
import (
        "fmt"
        "golang.org/x/net/context"
        "google.golang.org/api/option"
        "google.golang.org/api/sheets/v4"
        "log"
    )


const (
    client_secret_path = "./credentials/client_secret.json"
)


func NewSpreadsheetService() (*SpreadsheetService, error) {
    // Service account based oauth2 two legged integration
    ctx := context.Background()
    srv, err := sheets.NewService(ctx, option.WithCredentialsFile(client_secret_path), option.WithScopes(sheets.SpreadsheetsScope))

    if err != nil {
        log.Fatalf("Unable to retrieve Sheets Client %v", err)
    }

    c := &SpreadsheetService{
        service: srv,
    }

    return c, nil
}


func (s *SpreadsheetService) WriteToSpreadsheet(object *SpreadsheetPushRequest) error {

    var vr sheets.ValueRange
    vr.Values = append(vr.Values, object.Values)

    res, err := s.service.Spreadsheets.Values.Append(object.SpreadsheetId, object.Range, &vr).ValueInputOption("RAW").Do()

    fmt.Println("spreadsheet push ", res)

    if err != nil {
        fmt.Println("Unable to update data to sheet  ", err)
    }

    return err
}   

type SpreadsheetPushRequest struct {
    SpreadsheetId string        `json:"spreadsheet_id"`
    Range         string        `json:"range"`
    Values        []interface{} `json:"values"`
}

1
非常适合那些不想处理交互式OAuth2许可过程的方法,例如您希望它在服务器端完成。获取密钥,然后您就完成了。唯一需要注意的是Service Account必须被指定为项目所有者,然后您将所需的表与该帐户的电子邮件共享。该过程在此处描述:https://dev59.com/kFkT5IYBdhLWcg3wL8r3 - Denis Zubkov

0
  1. 将快速入门示例中的范围从 spreadsheets.readonly 更改为 spreadsheets,以获取读写访问权限
  2. 以下是写入代码片段:
    writeRange := "A1" // or "sheet1:A1" if you have a different sheet
    values := []interface{}{"It worked!"}
    var vr sheets.ValueRange
    vr.Values = append(vr.Values,values
    _, err = srv.Spreadsheets.Values.Update(spreadsheetId,writeRange,&vr).ValueInputOption("RAW").Do()

那应该可以工作:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接