Node.jsとasync-awaitでGoogle Spreadsheetに書く
これを使うのが良かったshokai.icon*5
mergeされたけどまだnpm publishされてないので、俺のgithubからインストールするといい $ npm i shokai/node-google-spreadsheet-as-promised -save
実行する毎に一番下の行に現在の時刻を追記する例
https://gyazo.com/133d7b267c0ff54d4f9ddcac6144ef06
code:add-date.js
import GoogleSpreadsheetAsPromised from 'google-spreadsheet-as-promised'
const CREDS = require('./credentials.json')
const SHEET_ID = '1Q9qh3rvFkkmrjeVvKCM4GtRNdd5QHNWkC2g4LlqmE4I'; // id from sheet URL
// シート末尾を探す
async function getTailRowIndex (worksheet) {
const cells = (await worksheet.getCells('A1:A1500')).getAllValues()
console.log(cells.length)
for (let i = 0; i < cells.length; i++) {
if (cellsi === '') return i }
}
(async function () {
const sheet = new GoogleSpreadsheetAsPromised()
await sheet.load(SHEET_ID, CREDS)
const worksheet = await sheet.getWorksheetByName('sheet1') // 事前にsheet1というシートを作っておく必要がある
const tailRowIndex = await getTailRowIndex(worksheet)
const cell = await worksheet.getCell(A${tailRowIndex + 1})
await cell.setValue(new Date().toString()) // 現在の日付を追記
console.log('done')
})().catch(err => console.error(err.stack || err))
APIにはワークシートの末尾行を探す機能がたぶん無い
1列1500行取得して探すことにした
SHEET_IDはスプレッドシートのURL内にあるID
credentials.jsonは、Service Accountを作ると手に入る。
で詳しく解説されている
google developer consoleでprojectを作成し、認証情報からサービスアカウントキーを作成する
https://gyazo.com/973adeb43690c70be286e20a5a885fdc
Service Accountとは
人間ではないbotアカウント
専用のメールアドレスが発行される
人間が普通にGoogle Spreadsheetを作成して、そこに共同編集者としてService Accountを招待して書き込ませる
特定の人間に紐付いていないので、作成者の退職等でアカウント削除してもService Accountは残る
認証情報は、アカウント作成時に1回だけダウンロードできる
JSON形式でもらえる
これをcredentials.jsonにリネームして、上のadd-date.jsと同じディレクトリに置く
再ダウンロードはできない
この仕様は安全でとても良いと思う
認証情報無くしたら、再発行ではなくアカウントそのものを再作成する
client_emailとprivate_keyを使って認証する
keyが漏れた時
特定のSpreadsheet専用のbotアカウントなので被害範囲をコントロールしやすい
対処しやすい
developer consoleからアカウントを削除する
sheetの共同編集者から削除する
普通のOAuthでtokenが漏れた場合は、applicationをrevokeしたり色々大変
Google公式のNode.jsライブラリが地雷だった
サンプルが無い
ドキュメントが無い
サンプルっぽいのがコード内に巨大なコメントアウトで埋め込まれているけど、肝心のrange等のプロパティが空でどうやって使うのかわからない
コード読んで理解しようと思ったけどgrepの邪魔でつらい
あとQuickstartの認証方法はService Accountではなく人間アカウントがOAuthでログインする方式なので、ただ記録を追記したいという目的には合わなかった。