LoginSignup
2
3

More than 3 years have passed since last update.

GoでGoogle Sheets APIを利用する【セルの更新】

Last updated at Posted at 2020-05-07

今回はGoでGoogle スプレッドシートへの書き込みについてまとめたいと思います。
Google Sheets APIを利用する事前準備、サービスアカウントの認証についてはこちらを参照してください。
Go言語、Google Sheets APIは学習途中なので間違った記述、非推奨なコードの書き方があった場合、ご指摘いただければ幸いです。

単一の範囲を更新する場合

単一の範囲対して更新を行う際は、Spreadsheets.Values.Update()を使用します。
Spreadsheets.Values.Update()の引数は、(スプレッドシートID, 更新範囲, sheets.ValueRange)となります。

サンプルコード

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()
}

実行結果

A B
1 123 hoge
2 1.23 hogehoge

スプレッドシートID

更新するスプレッドシートを指定する際に使用します。スプレッドシートIDは使用するスプレッドシートのURLから取得することができます。

https://docs.google.com/spreadsheets/d/hogehoge/edit#gid=0

上記のhogehogeの部分がスプレッドシートIDとなります。

更新範囲

更新する範囲を指定する際は、GUIと同様で下記のように指定します。

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

sheets.ValueRange

majorDimension

行と列どちらで更新するか指定します。デフォルトの値はROWSです。

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

サンプルコードのMajorDimension: "ROWS"ROWSCOLUMNSに変更して実行すると下記のように更新されます。

実行結果

A B
1 123 1.23
2 hoge 1.231.23

values

セルに書き込む値はValuesで指定します。記述する値は、interface型の2次元配列である必要があります。

クエリパラメータ

valueInputOption

更新する値の解釈方法を指定します。

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

サンプルコードのsheetsSrv.Spreadsheets.Values.Update(spreadsheetId, valueRange, rb).ValueInputOption("USER_ENTERED").Context(ctx).Do()USER_ENTEREDRAWに変更して実行すると下記のように数式が解釈されずに文字列として更新されます。

実行結果

A B
1 123 hoge
2 1.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()
}

実行結果

A B C D
1 123 hoge
2 1.23 hogehoge
3 456 fuga
4 4.56 fugafuga

sheets.BatchUpdateValuesRequest

valueInputOption

Spreadsheets.Values.Update()のクエリパラメータと同様です。

data

Dataに記述する値はsheets.ValueRangeの1次元配列である必要があります。
更新範囲は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()
}

実行結果

A B
1 123 hoge
2 1.23 hogehoge

sheets.BatchUpdateSpreadsheetRequest

fields

CellData内で更新するフィールドを指定します。ワイルドカードも指定できるようですが、非推奨のようです。

rows

セルの値はsheets.RowDataの配列で指定します。
更新値の型は下記で指定します。

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

range

Rangeでは、更新するシートと範囲を指定します。

StartRowIndexEndRowIndexで範囲の開始行と終了行を指定します。
StartColumnIndexEndColumnIndexで範囲の開始列と終了列を指定します。

SheetIdでは、更新するシートを指定します。
シートIDは使用するシートを開いたときのURLから取得することができます。

https://docs.google.com/spreadsheets/d/hogehoge/edit#gid=0

上記のgid=以降の部分がシートIDとなります。

参考資料

単一の範囲を更新する場合

Method: spreadsheets.values.update

複数の範囲を更新する場合

Method: spreadsheets.values.batchUpdate

枠線やセルの色と合わせて更新する場合

Method: spreadsheets.batchUpdate

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3