【问题标题】:Golang google sheets API V4 - Write/Update example?Golang google sheet API V4 - 编写/更新示例?
【发布时间】:2017-02-03 02:30:18
【问题描述】:

尝试用 Go 编写一个简单的三列表 ([][]string),但不能。 quick start 指南非常好,我现在可以阅读工作表,但是没有任何关于如何将数据写入工作表的示例,也许这很简单,但对我来说似乎不是。 我的大脑中的Golang library 太复杂了,无法弄清楚。 而且没有一个我可以用谷歌搜索的例子......

这个C# example 看起来很接近,但我不确定我是否清楚地了解C#

【问题讨论】:

  • 赞成承认有些事情太复杂以至于你的大脑无法弄清楚。有些人似乎认为你可以阅读的代码的存在是不创建好的文档的理由 - 我不是那些人中的一员。

标签: go google-sheets


【解决方案1】:

好吧,经过一些尝试后,就有了答案。一切都和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)
    }

}

【讨论】:

    【解决方案2】:

    如果您正在寻找基于服务帐户的身份验证,那么以下方法对我有用。

    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"`
    }
    

    【讨论】:

    • 对于那些不想处理交互式 OAuth2 权限过程的人来说,这是一种很好的方法,即你希望它是服务器端的。拿到钥匙,你就完成了。这里唯一的问题是必须将服务帐户指定为项目所有者,然后您将所需的表格与帐户的电子邮件共享。这里描述了这个过程stackoverflow.com/questions/38949318/…
    【解决方案3】:
    1. 将快速入门示例中的范围从 spreadsheets.readonly 更改为 spreadsheets 以进行读写访问
    2. 这里是写sn-p:
        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()
    

    这应该可行:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多