なお、まだ執筆着手してない。
自分を追い込むツール
どういうことかというと・・・
前回は、GASから技術書典向け原稿を格納してあるGoogle Driveの情報をGASから取得してみました。ただ、本当にやりたいことは「他の人がいかに進捗を出しているか通知することで、自分のモチベーションを向上させる」ことであるわけです。
そこで今回は、
- 技術書典向け原稿が格納してあるGoogle Drive上のあるフォルダの情報をGASから取得できるようにする
- それを
こっそりWebAPIとして叩けるようにする - 定期的にenebular(Node-RED)からそのAPIを叩く
- 誰かが進捗を出したときに、Slackに通知して自分を鼓舞する
みたいな仕組みを作ってみました。
まずはGAS側の実装
前回のように、DriveAppクラス
とDriveクラス
の両方を使っていきます。
DriveAppクラス
で特定のフォルダ内のファイルのリストを取得しそれぞれのIDを割り出すDriveクラス
でIDを使って「最終更新日」などの情報を取得- それらのデータをJSONに整形しWebAPIからGETできるようにする
こんな感じでセキュリティホール情報を取得できる術を作ってあげます。実際の実装はこんな感じ。
function doGet(e){ return ContentService.createTextOutput(JSON.stringify(getFileList())) } function getFileList() { var id = 'xxxxx' var data = {} data.fileList = [] var files = DriveApp.getFolderById(id).getFiles() while(files.hasNext()) { var file = files.next(); var fileDetail = Drive.Files.get(file.getId()) var fileInfo = {} fileInfo.name = file.getName() fileInfo.user = fileDetail.lastModifyingUserName fileInfo.date = fileDetail.modifiedDate data.fileList.push(fileInfo) } Logger.log(JSON.stringify(data)) return data }
そして、これをGASのメニューの「ウェブアプリケーションとして導入...」からWebAPI化します。GET時にはdoGet()
が呼ばれ、JSONがレスポンスとして返るようになります。
次にenebular側の実装
フローはこんな感じです。
- 先程ののWebAPIを定期的に叩く
- 最終更新日のタイムスタンプから最近更新されたファイルがあるかないかを判断
- ある場合は特定のSlackに対してWebhookを投げて通知を行う
Functionノードでは、一応タイムスタンプを見ています。
var message = ''; var criteriaDate = new Date(Date.now() - 1 * 60 * 60 * 1000); msg.payload.fileList.forEach(file => { if(criteriaDate < Date.parse(file.date)){ message += file.user + 'さんが頑張っています!\n' } }); msg.payload = message; return msg;
大したことをしていないですが、ここでは1時間以内に更新されたファイルが有るかないかを検知しています。あった場合は、ここで生成されたmessage
をSlackに投稿します。
動かしてみた
こんな感じで通知されます。
ふふふ・・・みんな頑張ってますね・・・ふふふ・・・。
そろそろ僕も頑張って執筆します・・・。