JavaScript
GoogleAppsScript
gas
Slack
RPA

Google Apps Script (GAS) で毎週 30 分の雑務を自動化した話

Google Apps Script を使って、毎週の雑務を自動化した話を書きます。

Google Apps Script とは

Google Apps Script (GAS) は G Suite 系のサービスをはじめ、Google アプリケーションの API を簡単にクラウドで実行できる環境。言語は JavaScript で書ける。GAS から外部 API も叩けるので、Google アプリケーション以外のサービスとのつなぎこみも可能。無料で使える。

自動化したこと

現在のプロジェクトではドキュメントや議事録を残すのに、 Qiita:Team を利用している。1 MTG 1 ページでアジェンダページを投稿している。自動化したのは 週初めにその週にある MTG のアジェンダページを一括投稿し、関係者に周知する作業。参加する MTG の数が増えてくると、この作業だけで時間がかなり取られるので自動化で楽になった。

実装方針

Qiita:Team にもテンプレート機能があるが、 MTG によって参加者や時間・タイトルを分けるためにテンプレートを量産したくなかったので、Google Docs でテンプレート管理した。具体的には以下のようなファイルを MTG の種類ごとに持つ。

スクリーンショット 2017-12-19 15.09.52.png

サンプルのテンプレートファイルと、全文コードは gist にて。
https://gist.github.com/tanabee/6d42e416c7beef8ecd7288b8b0332edb

以下、各ポイントを説明する。

1. Google カレンダーから定例 MTG の予定を抽出

スクリーンショット 2017-12-11 17.11.01.png

GAS で Google カレンダーからイベント情報を引っぱってくるのは CalendarApp.getDefaultCalendar().getEvents() メソッドを使用。ほぼワンラインで書けてしまうところがすごい!

var now = new Date();
var end = new Date(now.getTime() + (7 * 24 * 60 * 60 * 1000));// 一週間後
CalendarApp.getDefaultCalendar().getEvents(now, end, {search: "MTG名を書く"})[0];

2. テンプレートから記事のタイトル、本文を生成

テンプレートとして作成した Google Docs のドキュメントを開くのは DocumentApp.openById() を使用する。 ID は Google Docs を開いたときの URL の
https://docs.google.com/document/d/[ここがID]/edit

日付や時間を設定する部分を [[DATE]], [[DURATION]] のようにしており、この文字列を Google カレンダーのイベント情報から取得した値で置換する。

// Qiita の記事作成
function makeArticle(calendarEvent, docId) {
  var doc = DocumentApp.openById(docId);
  var title = doc.getName().replace('[[DATE]]', getDateFormatted(calendarEvent));
  var body = doc.getBody()
                .getText()
                .replace('[[DATE]]', getDateFormatted(calendarEvent))
                .replace('[[DURATION]]', getDuration(calendarEvent));
  return {
    title: title,
    body: body
  };
}

3. Qiita:Team に議事録ページを投稿

スクリーンショット 2017-12-11 17.27.48.png

Qiita API などの外部サービスの API を叩く時には、 UrlFetchApp.fetch() を使用。 Qiita:Team には Qiita:Team API ドキュメントに従って API トークンを取得し、 POST /api/v2/items する。

// Qiita:Team に投稿する
function postArticle(article) {
  var url = 'http://globis.qiita.com/api/v2/items';
  var token = '[Qiita:Team の API トークン]';

  var data = {
    "title": "記事タイトル",
    "body": "記事本文",
    "coediting": true,// 共同編集を有効化
    "tags": [
      {
        "name": "議事録"
      }
    ]
  };
  var payload = JSON.stringify(data);
  var res = UrlFetchApp.fetch(url, {
    method: 'POST',
    headers: {
      "Content-Type": 'application/json',
      Authorization: 'Bearer ' + token
    },
    payload: payload
  });
  var content = JSON.parse(res.getContentText("UTF-8"));
  return content.url;
}

4. 投稿したページの URL を Google カレンダーに記入

スクリーンショット 2017-12-11 17.43.31.png

カレンダーの詳細文を更新するのは CalendarEvent.setDescription() でできる。現状の詳細文を更新する場合は get した文字列に追記して set すればオッケー。

// カレンダーの説明文の先頭に URL 追記
function updateCalendarDescription(url, event) {
  var description = event.getDescription();
  description = 'アジェンダ&議事録\n' + url + '\n\n' + description;
  event.setDescription(description);
}

5. Slack Channel に投稿

スクリーンショット 2017-12-11 18.15.59.png

Qiita:Team API を叩くところと同じく UrlFetchApp.fetch() メソッドで Slack に投稿。

// Slack に POST
function postSlack(name, slackUrl, qiitaUrl) {
  var body = {
    text: '「' + name + '」のアジェンダ&議事録はこちらです :bow: ' + qiitaUrl
  };
  var payload = JSON.stringify(body);
  var res = UrlFetchApp.fetch(slackUrl, {
    method: 'POST',
    headers: {
      "Content-Type": 'application/json'
    },
    payload: payload
  });
}

別途 Slack の Incoming Webhooks を設定する必要がある。
以下の URL から追加できる。指定の Channel を選んで作成すると Webhook URL が生成される。
https://[workspace名].slack.com/apps/manage/custom-integrations

毎週実行するための作業

毎週月曜の朝にこのスクリプトを呼びだすようにする。GAS の画面で「編集>現在のプロジェクトのトリガー」から設定。 cron みたいなのを別で立てる必要がないのはすごく良い。他にも手元で実行(特にデバッグ時に)したり、API として公開したりできるので、ケースに合わせて実行の仕方を選べる。

スクリーンショット 2017-12-11 18.24.17.png

まとめ

これで毎週月曜に出社すると勝手にアジェンダ&議事録ページが出来上がって、関係者に周知するのを自動化できました。100行程度でこれが書ける GAS はすごいですね!社内の他の MTG でも使われ始めています。Slack にポストする際のユーザーを自分っぽくしておくと仕事やった感を出せて一石二鳥w

G Suite を使っている会社だと、メールやカレンダーなどもゴニョゴニョできるので、いろんな自動化ができそうですね(例えば Google Apps Scriptで、ラベルがない未読メールを全て既読にする とか SlackとGASを使って会社のお弁当発注を自動化した話 とか )! 毎週 N 分 x M 人 x L 種類の作業自動化が掛け算的にできてくると、全体の生産性がかなり上がりそうなので、これからも小ネタを見つけてやっていこうと思います。

他の GAS ネタ