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 のスイッチをオンにしてください.

f:id:tanjoin:20160126195620p:plain

コード

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

Qiita に書いた記事