読者です 読者をやめる 読者になる 読者になる

Google Docs の更新を監視して更新があれば Gist に放り込んで差分をチェックする

GoogleAppsScript GoogleDrive gist Slack HTML

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 に書いた記事