Lento con forza

大学生気分のIT系エンジニアが色々書いてく何か。ブログ名決めました。

Google Apps Scriptを使って無料でSlackにApp Storeレビューを流そう!

Google Apps Scriptにハマっています。 id:kouki_dan です。

Google Apps ScriptはGoogleスプレッドシート上でJavaScriptを実行できるもの、という認識が強いかもしれませんが、G Suite Developer Hubにより、もっと手軽に、様々な自作スクリプトを実行することができるスクリプト実行環境を持ったツールへと進化しました。

G Suite Developer Hubを使うことでWeb上でコードを書き、実行することができます。書いたスクリプトをHTTPのAPIとして公開することもできます。また、詳細な実行時間までは指定できないものの、定期実行を行うこともできるため、様々なタスクの自動化を行うこともできます。

そして、なんとこんな素晴らしい機能を無料1で使うことができます!
G Suite Developer Hubで動作する、App Storeのレビューコメントが更新された時にSlack通知を行うスクリプトを作ったので、この記事では導入方法を解説します。また、後半では技術的な解説も行います。。

Google Apps Scriptを使って無料でSlackにApp Storeレビューを流そう!

以下の4ステップを行うことでApp StoreのレビューをSlackに通知することができます。

  1. GASのテンプレートをコピーする
  2. SlackのIncoming-Webhookのトークンを作る
    1. でコピーしたテンプレートを編集する
  3. トリガーの設定をする

f:id:kouki_dan:20190801002636p:plain
このようなUIでSlackに投稿されます

詳細について説明します。

1. GASのテンプレートをコピーする

ストアレビューをSlack通知するためのスクリプトは10行程度です。テンプレートを用意したのでこれをコピーすると簡単に動作できます。

Slack Review Notifier - Template を開き、ファイル→コピーを作成とクリックし、自分のG Suite Developer Hubにコピーしてください。

f:id:kouki_dan:20190731235311p:plain

2. SlackのIncoming-Webhookのトークンを作る

Slack通知を行うために、SlackのIncoming-Webhookトークンを使用します。 Incoming-Webhookの設定ページから、以下の手順でトークンを生成してください。

Add Configurationボタンをクリック f:id:kouki_dan:20190731235813p:plain

Post to Channelのセレクトボックスから通知先のチャンネルを設定し、Add Incoming WebHooks integrationボタンをクリック f:id:kouki_dan:20190731235941p:plain

すると、この画面が表示されます。
「Webhook URL」がステップ3で必要になるので控えておいてください。 f:id:kouki_dan:20190801000115p:plain

3. 1. でコピーしたテンプレートを編集する

ここでどのアプリに対して、どの国のストアレビューを、Slackのどのチャンネルに通知するかを設定します。

  var STORE_COUNTRY = 'jp';
  var APPSTORE_APP_ID = '284882215';
  var APP_NAME = 'App Name';
  var SLACK_WEBHOOK_URL = 'https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXXX';

と書かれているところを、自分のアプリの設定に書き換えてください。デフォルトのAPPSTORE_APP_IDはFacebookのものになっています。APPSTORE_APP_IDはストアURLに含まれている、idxxxxxxxxxのxxxxxxxxxの部分です。Facebookの場合のストアURLは https://apps.apple.com/jp/app/facebook/id284882215 なので、 284882215 がAPPSTORE_APP_IDになります。 編集した結果は以下のようになります。

function main() {
  var STORE_COUNTRY = 'jp';
  var APPSTORE_APP_ID = '284882215';
  var APP_NAME = 'Facebook';
  var SLACK_WEBHOOK_URL = 'https://hooks.slack.com/services/T1B69T068/BLLD9F7RR/NV[秘密です]SH';
  appstore.getNewStoreReviews(
    PropertiesService.getScriptProperties(),
    STORE_COUNTRY, 
    APPSTORE_APP_ID, 
    "Store Reviews - " + APP_NAME,
    appstore.slackExporterCreator(SLACK_WEBHOOK_URL)
  );
}

また、左上の名前をクリックして、わかりやすい名前に変えておくと良いでしょう。このステップ完了後はこのようになります。 f:id:kouki_dan:20190801003216p:plain

メニューから実行→関数を実行→メインとクリックしていくことで、実行されます。初めてこれを実行しようとすると、以下のようなアラートが出ます。取得したレビューを保存しておくためのスプレッドシートへのアクセス権を要求しています。このスクリプトを実行するためには許可をする必要があります。 f:id:kouki_dan:20190801003115p:plain

許可をした後、少し待てばSlackに以下のように最近のレビューがSlackへ投稿されます。 f:id:kouki_dan:20190801002636p:plain

また、スプレッドシート一覧ページにも、通知に使っているスプレッドシートが作られていると思います。

4. トリガーの設定をする

ここまででSlack通知ができましたが、毎回実行を自分で押さなくてはいけないのは少々手間です。冒頭で述べた通りGoogle Apps Scriptでは定期実行を行うことが可能です。設定方法を説明します。

編集→現在のトリガーをクリックします f:id:kouki_dan:20190801003719p:plain

右下のトリガーの追加をクリックします f:id:kouki_dan:20190801003807p:plain

定期実行の設定画面が出るので、お好みの設定に切り替えた後、保存ボタンをクリックします。
f:id:kouki_dan:20190801003911p:plain

これで設定した時間ごとにレビューの更新をチェックし、更新があった場合にはSlackに通知されるようになります。

技術的な話

Google Apps Scriptのライブラリ

10行程度のコードでこれを実現できているのは、Google Apps Scriptのライブラリ機能を使っているからです。ライブラリ機能は自分の書いたスクリプトをライブラリとして公開し、他のスクリプトから利用することができます。 エディタ上のリソース→ライブラリ から設定することができ、指定した識別子のオブジェクトに、スクリプトで定義されている関数や変数などが詰め込まれてアクセス可能になります。

f:id:kouki_dan:20190801142616p:plain
ヘッダーに図書館と書いてありますが、Libraryの日本語訳だと思われます

このライブラリのスクリプトはこちらにあります。 https://script.google.com/d/1kz4zVc_k7Fi1gaVfKcj8VCzIKFsqLcBS0TdtxVC6FHlGLJo1p1IYibnO/edit?usp=sharing

ライブラリの紹介

reviews.gs に定義されている getNewStoreReviews を呼び出すことでレビューが投稿されます。この関数の引数では

  • scriptProperties
  • ストアの情報
  • exporter

と3つの情報を受け取ります。 documentPropertiesは、PropertiesService.getScriptProperties() で取得できます。これはGASで扱える小さいKVSのようなもので、スクリプト毎のスコープを持っています。このスクリプトでは、スプレッドシートのIDをここに保存しています。引数として受け取る理由は、ライブラリとして使うスクリプト内でPropertiesService.getScriptProperties() を実行すると、ライブラリのスコープのPropertyServiceが生成されてしまうため、呼び出し側のスクリプトからアクセスできなくなってしまうからです。

exporterは、レビューが更新された時に呼び出される関数です。ここにSlack通知を行う関数を渡すことでSlack通知を実現しています。現在ライブラリで用意しているexporterはSlackのexporterだけですが、自分でexporterを記述することで、Slack以外にも対応することができます。
これは、7個の引数 (title, content, rating, version, author_name, date, title_link) を受け取る関数をexporterとして渡すことで実現できます。 slack.gs ファイルにSlackの場合の例があるので、もしSlackを使っていない方は自分でexporterを定義すると良いでしょう。

Spreadsheet as a Database

このスクリプトではスプレッドシートをデータベースとして活用しています。通知済みのレビューコメントは全てスプレッドシートに保存してありますし、このデータを使ってレビューコメントの 重複排除を行なっています。

現在は同じレビューをなんども通知を行わないためにスプレッドシートを活用していますが、 GASではHTTPアクセスが可能なウェブアプリを作成することができます。将来的にウェブアプリを作ることで、レビューコメントをわかりやすくブラウザ上で確認できるようにする発展が考えられます。

これだけの機能を持つのに無料で使えることは本当にありがたいです。

まとめ

Google Apps Scriptは無料でいろんなことができるのでとても楽しいです。導入は少し手間ですが、難しいものではありません。

そして、Google Apps Scriptを使えば色々なものを作ることができます。こういったものも作れば良さそう!みたいなことがあれば実際に作って後悔したり、どんなものがあるのかを教えてもらえると嬉しいです!


  1. 実際は制限がありますが個人で使う分にはほぼ気にしなくて良い制限になっています。