使用Go来更新Google Sheets API中的单元格

这次我想总结一下关于使用Go来写入Google Sheets的内容。
关于使用Google Sheets API的准备工作和服务账号的认证,请参考这里。
由于我正在学习Go语言和Google Sheets API,所以如果有错误的描述或不推荐的代码写法,请不吝赐教。

如果更新单个范围的话

当仅对一个区域进行更新时,可以使用Spreadsheets.Values.Update()。
Spreadsheets.Values.Update()的参数是(表格ID,更新范围,sheets.ValueRange)。

示例代码 (Example code)

package main

import (
    "encoding/json"
    "io/ioutil"

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

type credentialsJson struct {
    Email      string `json:"client_email"`
    PrivateKey string `json:"private_key"`
}

func main() {
    // サービスアカウントでの認証
    bytes, _ := ioutil.ReadFile("credentials.json")
    var credentials credentialsJson
    json.Unmarshal(bytes, &credentials)

    conf := &jwt.Config{
        Email:      credentials.Email,
        PrivateKey: []byte(credentials.PrivateKey),
        TokenURL:   google.JWTTokenURL,
        Scopes: []string{
            // スプレッドシートの読み込みと書き込みを許可
            "https://www.googleapis.com/auth/spreadsheets",
        },
    }

    client := conf.Client(oauth2.NoContext)

    sheetsSrv, _ := sheets.New(client)
    // スプレッドシートの指定
    spreadsheetId := ""

    ctx := context.Background()

    // 更新範囲の指定
    valueRange := "A1:B2"
    // 更新値の指定
    rb := &sheets.ValueRange{
        MajorDimension: "ROWS",
        Values: [][]interface{}{
            []interface{}{"123", "hoge"},
            []interface{}{"1.23", "=B1&B1"},
        },
    }

    sheetsSrv.Spreadsheets.Values.Update(spreadsheetId, valueRange, rb).ValueInputOption("USER_ENTERED").Context(ctx).Do()
}

执行结果

AB1123hoge21.23hogehoge

电子表格的ID

在指定要更新的电子表格时使用。您可以从要使用的电子表格的URL中获取电子表格ID。

请修改以下链接中的内容:https://docs.google.com/spreadsheets/d/hogehoge/edit#gid=0

上述的hogehoge部分即为Google Sheets的ID。

更新的范围

在指定需要更新的范围时,与图形用户界面(GUI)相同,如下所示进行指定。

例備考”シート名”シート名が一致するシートの全体を範囲とする。”A1:B2″最初のシート(一番左のタブ)のA1からB2を範囲とする。”シート名!A1:B2″シート名が一致するシートのA1からB2を範囲とする。

表格的值范围

主要维度

指定更新是在行或列中进行的。默认值为行。

値備考ROWS行で更新します。COLUMNS列で更新します。

将示例代码中的MajorDimension: “ROWS”中的ROWS更改为COLUMNS并执行,结果将更新如下。

执行结果

AB11231.232hoge1.231.23

价值观

在单元格中写入的值由Values指定。所写入的值必须是interface类型的二维数组。

查询参数

输入选项

指定更新值的解释方法。

値備考RAW更新する値は解釈されません。USER_ENTEREDGUIで更新するときと同様の解釈がされます。

将下面的样本代码中的USER_ENTERED参数更改为RAW并执行,将以字符串形式更新,而不是解释为公式。

样本代码:sheetsSrv.Spreadsheets.Values.Update(spreadsheetId, valueRange, rb).ValueInputOption(“USER_ENTERED”).Context(ctx).Do()

修改为:sheetsSrv.Spreadsheets.Values.Update(spreadsheetId, valueRange, rb).ValueInputOption(“RAW”).Context(ctx).Do()。

请注意,以上是我用中文对原始文本的翻译,希望对您有帮助。

执行结果

AB1123hoge21.23=B1&B1

如果要更新多个范围。

如果您想要同时更新多个范围,可以使用Spreadsheets.Values.BatchUpdate()。Spreadsheets.Values.BatchUpdate()的参数为(电子表格ID,sheets.BatchUpdateValuesRequest)。

示例代码

package main

import (
    "encoding/json"
    "io/ioutil"

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

type credentialsJson struct {
    Email      string `json:"client_email"`
    PrivateKey string `json:"private_key"`
}

func main() {
    // サービスアカウントでの認証
    bytes, _ := ioutil.ReadFile("credentials.json")
    var credentials credentialsJson
    json.Unmarshal(bytes, &credentials)

    conf := &jwt.Config{
        Email:      credentials.Email,
        PrivateKey: []byte(credentials.PrivateKey),
        TokenURL:   google.JWTTokenURL,
        Scopes: []string{
            // スプレッドシートの読み込みと書き込みを許可
            "https://www.googleapis.com/auth/spreadsheets",
        },
    }

    client := conf.Client(oauth2.NoContext)

    sheetsSrv, _ := sheets.New(client)
    // スプレッドシートの指定
    spreadsheetId := ""

    ctx := context.Background()

    // 更新範囲と更新値の指定
    valueRange1 := "A1:B2"
    values1 := [][]interface{}{
        []interface{}{"123", "hoge"},
        []interface{}{"1.23", "=B1&B1"},
    }

    valueRange2 := "C3:D4"
    values2 := [][]interface{}{
        []interface{}{"456", "fuga"},
        []interface{}{"4.56", "=D3&D3"},
    }

    rb := &sheets.BatchUpdateValuesRequest{
        ValueInputOption: "USER_ENTERED",
        Data: []*sheets.ValueRange{
            &sheets.ValueRange{
                Range:          valueRange1,
                MajorDimension: "ROWS",
                Values:         values1,
            },
            &sheets.ValueRange{
                Range:          valueRange2,
                MajorDimension: "ROWS",
                Values:         values2,
            },
        },
    }

    sheetsSrv.Spreadsheets.Values.BatchUpdate(spreadsheetId, rb).Context(ctx).Do()
}

执行结果

ABCD1123hoge

21.23hogehoge

3

456fuga4

4.56fugafuga

批量更新值请求的sheets.BatchUpdateValuesRequest

值输入选项

与Spreadsheets.Values.Update()的查询参数相同。

数据

数据在Data中的值必须是一个sheets.ValueRange的一维数组。
更新范围在sheets.ValueRange中通过Range指定。
除此之外和Spreadsheets.Values.Update()相同。

如果与边框线或单元格颜色相匹配进行更新的情况下

如果要根据框线和单元格颜色来更新单元格的值,则可以使用Spreadsheets.BatchUpdate()方法。
Spreadsheets.BatchUpdate()方法的参数是(电子表格ID,sheets.BatchUpdateSpreadsheetRequest)。

示例代码

package main

import (
    "encoding/json"
    "io/ioutil"

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

type credentialsJson struct {
    Email      string `json:"client_email"`
    PrivateKey string `json:"private_key"`
}

func main() {
    // サービスアカウントでの認証
    bytes, _ := ioutil.ReadFile("credentials.json")
    var credentials credentialsJson
    json.Unmarshal(bytes, &credentials)

    conf := &jwt.Config{
        Email:      credentials.Email,
        PrivateKey: []byte(credentials.PrivateKey),
        TokenURL:   google.JWTTokenURL,
        Scopes: []string{
            // スプレッドシートへの読み込みと書き込みを許可
            "https://www.googleapis.com/auth/spreadsheets",
        },
    }

    client := conf.Client(oauth2.NoContext)

    sheetsSrv, _ := sheets.New(client)
    // スプレッドシートの指定
    spreadsheetId := ""

    ctx := context.Background()

    requests := []*sheets.Request{
        &sheets.Request{
            UpdateCells: &sheets.UpdateCellsRequest{
                Fields: "UserEnteredValue",
                Rows: []*sheets.RowData{
                    &sheets.RowData{
                        // 更新値を指定
                        Values: []*sheets.CellData{
                            &sheets.CellData{
                                UserEnteredValue: &sheets.ExtendedValue{
                                    NumberValue: 123,
                                },
                            },
                            &sheets.CellData{
                                UserEnteredValue: &sheets.ExtendedValue{
                                    StringValue: "hoge",
                                },
                            },
                        },
                    },
                    &sheets.RowData{
                        // 更新値を指定
                        Values: []*sheets.CellData{
                            &sheets.CellData{
                                UserEnteredValue: &sheets.ExtendedValue{
                                    NumberValue: 1.23,
                                },
                            },
                            &sheets.CellData{
                                UserEnteredValue: &sheets.ExtendedValue{
                                    FormulaValue: "=B1&B1",
                                },
                            },
                        },
                    },
                },
                // 更新範囲を指定
                Range: &sheets.GridRange{
                    EndColumnIndex:   2,
                    EndRowIndex:      2,
                    // シートIDを指定
                    SheetId:          0,
                    StartColumnIndex: 0,
                    StartRowIndex:    0,
                },
            },
        },
    }

    rb := &sheets.BatchUpdateSpreadsheetRequest{
        Requests: requests,
    }

    sheetsSrv.Spreadsheets.BatchUpdate(spreadsheetId, rb).Context(ctx).Do()
}

运行结果

AB1123hoge21.23hogehoge

sheets.BatchUpdateSpreadsheetRequest 批量更新电子表格请求

领域

在CellData中指定要更新的字段。虽然可以指定通配符,但似乎不推荐。

行数

在中国人民友好日益增进的大环境下,中日两国人民正以更加积极的姿态广泛开展交流合作。为实现中日关系实质性改善和长远发展,我们需要以双方之间的相互理解和尊重为基础,加强各领域交流与互动。为了更好地推动中日友好合作,我们可以通过加强两国间的文化、教育、经济、科技等领域的交流合作来促进彼此间的了解和友谊,为两国的共同繁荣与发展贡献力量。

Translation:
在谷歌表格中,我们可以通过使用`sheets.RowData`的数组来指定单元格的值。
对于更新的值的类型,可以通过下面的方式来指定。

値備考NumberValue左記で指定した値は数値になります。StringValue左記で指定した値は文字列になります。FormulaValue左記で指定した値は数式になります。

范围

在Range中,我们指定要更新的工作表和范围。

使用StartRowIndex和EndRowIndex来指定范围的起始行和结束行。
使用StartColumnIndex和EndColumnIndex来指定范围的起始列和结束列。

在SheetID中,指定要更新的工作表。
您可以从打开要使用的工作表的URL中获取工作表ID。

请使用以下中文的其中一种方式来改写这个句子:请点击此处访问 https://docs.google.com/spreadsheets/d/hogehoge/edit#gid=0

上面的gid=后面的部分将成为工作表的ID。

参考文献

如果要更新一个单一的范围

方法:电子表格.值.更新

如果要更新多个范围

方法:电子表格.值.批量更新

如果与边框线或单元格颜色相配合后进行更新的话。

方法:电子表格批量更新