こんにちは! サポート・アプリ申請チームのあきなです。
アプリ申請チームとは、クライアントから申請依頼があったアプリを、AppleやGoogleに審査提出する業務を主に行なっているチームです。
審査提出の他にも業務が多岐に渡り、業務の効率化を常に行なっています。 今回はアプリの公開という作業について実施した効率化についてご紹介します。 エンジニアではないですが、周りのエンジニアさんにご協力いただきつつ、自動化を行いました!
※公開作業とは アプリが審査通過後、公開ボタンを押してAppStoreやPlayStoreにアプリを公開すること
やったこと
- SlackワークフローとZapier、GASを使用して、予定をGoogleカレンダーに登録/削除する仕組みづくり
- 登録された日時にSlackにアラートを流し、作業完了までリマインダーを送信
利用したツール
- Slackワークフロー
- GoogleAppsScript
- Zapier
なぜ自動化をしたのか
公開方法のひとつ「手動公開」において、これまで手作業が多く、対応漏れや情報伝達不足が発生していました。これを防ぐために自動化を実施しました。
今までのフロー
- ディレクター(Dir)やカスタマーサクセス(CS)がクライアントと連絡を取り、公開したい日時を決める
- Dir / CS(依頼者)カレンダーに予定と必要な情報を入力、サポートメンバーもカレンダーに招待
- 公開日時がきたらGoogleカレンダーから届いた通知をもとに、サポートが公開作業を行う
これまでの問題点
- 通知がGoogleカレンダーのみで、漏れが発生する可能性がある
- 公開する際に情報が不足していることがある
自動化後のフロー
紫の部分を全てシステム化しました。
それにより、これまでの問題点を以下のように解決できました。
- 公開対応を行うまで、リマインドを何度も行うことで漏れをなくす
- ワークフローを利用することで、公開対応に必要な情報を必須項目として収集できる
データはすべて以下のようにGoogleスプレッドシートで管理しており、件数や公開時期の傾向などもデータとして分析できるようになりました!
- 公開依頼シート
- キャンセル依頼シート
処理の詳細
Slackワークフローの処理
- 依頼があったら、スプレッドシートに依頼内容を記載
- Slackで申請チーム宛に「依頼があった旨」を投稿
Zapierの処理
登録のとき
- 公開依頼シートに新しい行が追加されたら以下の処理を行う
- カレンダーに予定を追加
- 申請チームのメンバーを自動でカレンダーに招待
- 予定のカレンダーIDを取得し、スプレッドシートに記載
- 処理完了後、Slackに登録完了通知
削除のとき
- キャンセル依頼シートに新しい行が追加されたら以下の処理を行う
- 入力されたカレンダーIDを参照し、該当の予定をカレンダーから削除
- カレンダーIDを参照し、公開依頼シート内の該当の予定の行に以下を入力する - 実行フラグ:不要 - 対応状況 :キャンセルを入力 ※この対応が必要な理由は後述
- 処理完了後、Slackに削除完了通知
GASの処理
- 5分おきに依頼をまとめたスプレッドシートの日付を見るトリガーを設定
- 現在時刻以前の依頼日があり、かつ、「実行フラグ」と「対応状況」が空白の場合は公開処理のアナウンス - ※キャンセル依頼が来た場合はこの処理が走らないよう、実行フラグと対応状況を自動入力しています。
- 1度の処理後、実行フラグ列に「実行済み」を自動入力
- 「対応状況」列に「done」が入力されるまで20分おきにリマインド(doneは公開対応を行った人がスプシに手入力)
function postToSlack() { // スプレッドシートのシート名と範囲を設定します var sheetName = "公開依頼シート"; // 日付がある列と時間がある列の範囲 var range = "A2:I"; // スプレッドシートのデータを取得します var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName); var data = sheet.getRange(range).getValues(); var last_row = sheet.getLastRow(); // 現在の日付と時間を取得します var now = new Date(); // データを走査し、指定された時間になったらSlackに投稿します for (var i = 0; i < last_row -1; i++) { var date = data[i][0]; var os = data[i][1]; var appliname = data[i][3]; var irainin = data[i][4]; //依頼者 var exec_flag = data[i][9]; //実行フラグ var done_flag = data[i][6]; //対応フラグ // JavaScriptのDateオブジェクトに変換 var targetDateTime = new Date(date); if((now >= targetDateTime) && (exec_flag == "")){ if (type == "公開処理"){ // message var icon = "koukai"; var name = "公開処理依頼!!!!"; var message = "@shinsei-all 公開処理の時間です!\n\n" + "アプリ名 : " + appliname + "\n" + "OS : " + os + "\n" + "依頼人 : " + irainin + "\n" + "対応する人はスタンプと、対応後に<https://docs.google.com/spreadsheets/d/hogehoge|こちらのスプレッドシート>にDoneの記載をお願いします!!\n"; sendToSlack(message, name, icon); sheet.getRange((i + 2),10).setValue("実行済み"); var reminder_time = new Date(targetDateTime.getTime() + (20 * 60 * 1000)); // 20分後の時間を計算 if((now >= reminder_time) && (done_flag == "")){ var timing = 10; //1時間をこの数値で割った分に送信する if ((now.getMinutes() % timing) == 0){ var icon = ":remind2:"; var name = "リマインド"; var message = "@shinsei-all\n" + "アプリ名 : " + appliname + "対応しましたか?:eye: \n" + "対応完了後は<https://docs.google.com/spreadsheets/d/hogehoge|こちらのスプレッドシート>にDoneと入力してください!\n"; sendToSlack(message,name,icon); } } } }
難しかった点
- Zapierにおいて日本時間への変換が必要だった点
- 実行日時をZapierに入れるとUTC基準で処理が行われるため、日本時間に変更する必要があった
- 予定作成後にカレンダーIDをスプレッドシートの該当の行に反映させる方法が見つからなかった点
- 現状はSlackワークフローに、予め【最終行取得】の列に【1】と入力するように設定
- 最終行の箇所にカレンダーIDを入力させ、その処理が終わったら【最終行取得】の項目を【0】に置き換える形で対応
これからやりたいこと
- Slackワークフローを「レガシーワークフロー」から移行して、システムで入力しやすさを担保
- 5分以内に2つ以上の依頼が来た場合に【最終行取得】に2つ以上【1】が存在することになり、エラーが発生する事象の解消
- スプレッドシートに「Done」と入力する作業もSlackリアクションなどで自動入力できるようにする
- Doneと入力するとき元データのスプシを直接触る必要があり、これが事故につながる可能性があるため。
まとめ
冒頭にも記載しましたが、私はエンジニアではありませんが簡単なGASを書いたりZapierを用いて自動化をすることができました!
今回は特にZapierにおいて、検索してもやりたいことにたどり着けないことが多くありましたが、 検索したり、他の方のZapierを見てもわからないことがあった場合に、質問をできる環境があるため、Yappliは新しいことにチャレンジしやすい環境だと思っています。
まだまだ考慮が甘い部分は多くありますが、今後も増えてゆく申請を丁寧にこなすためにも自動化を進めて行きます!