要旨
・GoogleAppsScriptを使用しなくてもスプレッドシートを操作できる
・ヘッダを元に列を指定して値をセットする場合はGASの方がずっとやりやすい(必ず1行目にヘッダがなくてはダメ、大文字英字やアンダーバーを使った文字列のヘッダ指定ができない)
・6分の壁とか気にしなくていいのは楽
・GASよりは安定してる気がするがやはりまだ不安定感が残る
・NodejsからGoogle Sheets APIを使う用のパッケージが複数あるが、いずれも若干のバグあり
(今回使用したパッケージは一括更新のbulkUpdateCellsが動作しない)
使用パッケージ
google-spreadsheet (ver. 2.0.6)
https://www.npmjs.com/package/google-spreadsheet
シートサンプル
Google Sheet API Qiita説明用サンプル
https://docs.google.com/spreadsheets/d/1pNmXvx5vL2pEICe6_2PVFfuQ2WYoRaVA7K05i9s8-Aw/edit?usp=sharing
事前注意
こちらの記事を元にAPI認証情報のJSONを取得しておいてください
(大変参考にさせて頂きました。この場を借りてお礼申し上げます)
https://qiita.com/howdy39/items/ca719537bba676dce1cf
コード
async function sample() {
try {
const GoogleSpreadsheet = require('google-spreadsheet');
const creds = require('./google-generated-creds.json'); //API認証情報JSONを同ディレクトリに置いておく
var spreadsheet_id = '1pNmXvx5vL2pEICe6_2PVFfuQ2WYoRaVA7K05i9s8-Aw'; //スプレッドシートのID
var worksheet_name = "シート2"; //操作したいワークシートのシート名
var book = new GoogleSpreadsheet(spreadsheet_id); //インスタンス
var spreadsheet; //スプレッドシート
var worksheet; //ワークシート
var rcnt1; //ループカウンタ1
var rcnt2; //ループカウンタ2
//認証を通しスプレッドシートの情報取得して外部スコープの変数に保存
book.useServiceAccountAuth(creds, function(error) {
if (error !== null) {
throw new Error(error);
}
book.getInfo(function(error, data) {
if (error !== null) {
throw new Error(error);
}
spreadsheet = data;
});
});
//指定した名前のスプレッドシートの値を更新する
for (rcnt1 in spreadsheet.worksheets) {
if (spreadsheet.worksheets[rcnt1].title === worksheet_name) {
spreadsheet.worksheets[rcnt1].getRows({
offset: 1, //何も指定しなければ2行目から読み込むので1を指定すると3行目から読み込む
limit: 20, //途中で空白行が現れれば20行以下でも読み込み中止
}, function(error, rows) {
if (error !== null) {
throw new Error(error);
} else {
for (rcnt2 in rows) {
rows[rcnt2].sku = "new_sku"; //1行目の値が"sku"の列の(rcnt2 + 1 + offset)行目の値を"new_sku"に変更
rows[rcnt2].price = 19800;
rows[rcnt2].save();
}
}
});
}
}
return Promise.resolve(0);
} catch(error) {
console.error(error);
return Promise.reject(1);
}
}