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 みたいなのが欲しいところ