Google Docs の更新を監視して更新があれば Gist に放り込んで差分をチェックする
Google Docs で1日に何度も更新されるドキュメントがある 手軽でよいのだが Read Only なので変更履歴すら見れない
更新通知や差分が全然わからん!誰かに聞かないと何もわからない状況 なんという屈辱…………許さへん……じぇったい許さへん……
Gist
Github を利用するレベルの規模ではないので今回は Gist を利用する. 先に対象のGistを作成して更新するだけというシンプルなものにする.
function updateGist(id, access_token, text) { var url = 'https://api.github.com' + '/gists/' + id + '?access_token=' + access_token; var payload = { 'description': 'ドキュメントが更新されちょるばい!', 'files': { 'docs.html': { 'content': text } } }; var param = { 'method': 'POST', // ほんとは patch 'contentType': 'application/json', 'payload': JSON.stringify(payload); }; return UrlFetchApp.fetch(url, param); }
Slack
以前も記事にした方法を利用する.
function slack(text, channel, token) { var url = ''; var parse = 'none'; var payload = { 'token': token, 'channel': channel, 'text': text, 'username'; '小鳩', 'parse': 'none', 'icon_emoji': ':kobato:' }; var param = { 'method': 'POST', 'payload': payload }; return UrlFetchApp.fetch(url, param); }
Google Document to HTML
Google App Script だけでは getAs() が PDF にしか変換できなかったので Drive API を利用することにした.
注意事項
Google デベロッパーコンソールを有効にして、[リソース] - [Google の拡張サービス…] で Drive API のスイッチをオンにしてください.
コード
function getDocument(fileId) { var file = Drive.Files.get(fileId); var htmlLink = file.exportLinks['text/html']; if (!htmlLink) { throw 'File cannot be converted to HTML.'; } var oAuthToken = ScriptApp.getOAuthToken(); return UrlFetchApp.fetch(htmlLink, { headers: { 'Authorization': 'Bearer ' + oAuthToken } }); }
HTML のリンクを開くための認証に苦戦したが、なんとなくググったところ
とても簡単な var oAuthToken = ScriptApp.getOAuthToken();
で終わった
main
前提
- Slack のチャンネルは仮で '#kanshi'
- Slack のトークンは仮で 'token' を使う
- Gist の ID は仮で 'piyo' を使う
- Gist のアクセストークンは仮で 'access_token' を使う
- 最終更新日はセル (1, 1) にある
- ドキュメントの ID は仮で 'hoge' を使う
- スプレッドシートの URL は仮で 'fuga' を使う
- 1行で出力されると差分が見づらいので改行を無理やり入れる
コード
function main() { var spreadsheet = SpreadsheetApp.openByUrl('fuga'); var sheet = spreadsheet.getSheets()[0]; var docsId = 'hoge'; var file = DriveApp.getFileById(docsId); var oldLastUpdated = parseInt(sheet.getRange(1,1).getValue()); var lastUpdated = file.getLastUpdated(); if (oldLastUpdated < lastUpdated.getTime()) { updateGist('piyo', 'access_token', getDocument(docsId).toString().replace(/>/g,'>/n')); slack('ドキュメントが更新されちょるばい!', '#kanshi', 'token'); } sheet.getRange(1,1).setValue(lastUpdated.getTime()); }
まとめ
Google が更新あったら通知してくれて、差分もいい感じに見せてくれたら こんなことしなくて済んだんだけど!
あと Google App Script でもお手軽な HTML Beautifier みたいなのが欲しいところ