GoogleAppsScriptでAppStore新着をSlack連携する

今回は以前、以下記事で紹介したAppStoreのAPIを使ってランキング情報を取得する方法を利用して新着アプリのみをSlackに連携する方法を紹介していきます。
GoogleAppsScriptでAppStoreランキング情報を取得してSheet上にリスト化する

データの保管先

一般的なアプリケーションを構築する場合は以下の形で実施することになるかと思います。

  1. AppStoreAPIで取得したデータをDBに保管
  2. 次に取得したとき、DB内を参照して存在しないデータのみを新着アプリとしてストック
  3. Slack連携

今回はGoogleAppsScript上で完結させたいため、別Sheetにデータを保管する形で実装します。

  1. AppStoreAPIで取得したデータをdb sheetに保管
  2. 次に取得したとき、db sheetを参照して存在しないデータのみを新着アプリとしてストック
  3. Slack連携

db sheetの作成、データの保管

まずはデータ保管用のsheetにあたる「db」sheetを作成しましょう。続けて以下スクリプトコードを登録します。登録の仕方などは過去の記事を参考にしてみてください。

// 起動するファンクション
function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('base');
  var dbsheet = ss.getSheetByName('db');
  
  // ここで事前に生成したURLを呼び出して結果を取得
  var resJson = UrlFetchApp.fetch("https://rss.itunes.apple.com/api/v1/jp/ios-apps/top-free/games/100/explicit.json");
  // JavaScriptで扱いやすくするため戻ってきた結果をJsonからJavaScriptのオブジェクトに変換
  var res = JSON.parse(resJson);
  // アプリ毎の配列でループ処理して結果の一部をシートの対象セルにセット
  var activeCnt = 1;
  for (var cnt in res.feed.results) {
    // db sheet情報とチェックするアプリ名を渡す
    var ret = appCheck(dbsheet, res.feed.results[cnt], cnt);
    if (ret) {
      // rank
      sheet.getRange(activeCnt, 1).setValue(parseInt(cnt) + 1);
      // アプリ名
      sheet.getRange(activeCnt, 2).setValue(res.feed.results[cnt].name);
      // アプリ制作会社
      sheet.getRange(activeCnt, 3).setValue(res.feed.results[cnt].artistName);
      // リリース日
      sheet.getRange(activeCnt, 4).setValue(res.feed.results[cnt].releaseDate);
      activeCnt = activeCnt + 1;
    }
  }
}

// 以前にdb sheetに登録済みかどうかをチェックする
// true : 該当アプリなし
// false : 該当アプリ登録済み
function appCheck(dbsheet, app, baseCnt) {
  // 1行目からアプリ名が存在するかチェックする
  var checkCnt = 1;
  while(true) {
    var val = dbsheet.getRange(checkCnt, 2).getValue();
    if (val == '') {
      // 空行になったらチェックするループを抜ける
      break;
    }
    if (val == app.name) {
      // 同じ名前のアプリが存在しているためfalseで終了
      return false;
    }
    checkCnt++;
  }
  // 同じ名前のアプリが見つからない場合はdb sheetに記録して終了する
  // rank
  dbsheet.getRange(checkCnt, 1).setValue(parseInt(baseCnt) + 1);
  // アプリ名
  dbsheet.getRange(checkCnt, 2).setValue(app.name);
  // アプリ制作会社
  dbsheet.getRange(checkCnt, 3).setValue(app.artistName);
  // リリース日
  dbsheet.getRange(checkCnt, 4).setValue(app.releaseDate);
  return true;
}

// menu追加
function onOpen(event){
  // 配列で登録したいメニューを追加する
  var func = [
    // name:部分にメニューで表示したい名前
    // functionName:登録したいfunction名
    {name:'appranking', functionName:'myFunction'}
  ];
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  // Sheet上のメニューに登録する名前
  sheet.addMenu('myMenu', func);
}

実施している流れとしては以下になります。
1.onOpenで登録したfunction = myFunctionを起動する
2. AppStoreAPIからアプリ情報を取得
3. appCheck functionで以前に記録したアプリかどうかをチェックする ※初回起動時はdb sheetは空のため全てtrueで返却されます
4. db sheetおよびbase sheetに記録される

この状態からdb sheetから取得で2行目あたりを削除して再実行すると削除したアプリ情報がdb sheetの一番下の行に追記され、base sheetに存在しないアプリ情報だけが記録されます。
※行を削除するときに空行にしないように注意してください。

slack連携準備

ここまで来ると、残り実施することはbase sheetに記録される情報をslack連携するのみとなります。以下記事と組み合わせた実装になります。

今回はSlackで提供されているWebAPIを使います。Slackの登録と以下記事を参考にURL取得まで実施してください。いずれも無料です。
Slack でのIncoming Webhook の利用

または以下記事と組み合わせてメールで送付する方法も可能です。
Stand alone形式でGoogleAppsScriptを作成しgmailでメールを送付する

Slack連携

上で発行したToken情報を使ってAPIリクエスト部分を作成します。追記した部分はslack通知用のslackPost functionの作成と、myFunctionでbase sheetに記載していたアプリ情報をSlack送信用のメッセージ作成に切り替えている部分です。

// 起動するファンクション
function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var dbsheet = ss.getSheetByName('db');
  
  // ここで事前に生成したURLを呼び出して結果を取得
  var resJson = UrlFetchApp.fetch("https://rss.itunes.apple.com/api/v1/jp/ios-apps/top-free/games/100/explicit.json");
  // JavaScriptで扱いやすくするため戻ってきた結果をJsonからJavaScriptのオブジェクトに変換
  var res = JSON.parse(resJson);
  // アプリ毎の配列でループ処理して結果の一部をシートの対象セルにセット
  var activeCnt = 1;
  var slackmsg = "";
  for (var cnt in res.feed.results) {
    // db sheet情報とチェックするアプリ名を渡す
    var ret = appCheck(dbsheet, res.feed.results[cnt], cnt);
    if (ret) {
      // rank
      slackmsg = slackmsg + "rank:" + (parseInt(cnt) + 1) + "\n";
      slackmsg = slackmsg + "アプリ名:" + res.feed.results[cnt].name + "\n";
      slackmsg = slackmsg + "アプリ会社:" + res.feed.results[cnt].artistName + "\n";
      slackmsg = slackmsg + "リリース日:" + res.feed.results[cnt].releaseDate + "\n";
      slackmsg = slackmsg + "URL:" + res.feed.results[cnt].url + "\n";
      slackmsg = slackmsg + "----------\n"
      activeCnt = activeCnt + 1;
    }
  }
  if (!slackmsg) {
    // 新着アプリがない場合のメッセージ送信
    slackmsg = "新規アプリはありません"
  }
  slackPost(slackmsg);
}


// Slack送信用Function
function slackPost(message) {
  // username部分にはslackの送信元として表示したい名前を入力
  var jsonData = {
     "username" : "gasbot",
     "text" : message
  };
  var payload = JSON.stringify(jsonData);
  var options = {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : payload
  };
  // URLのパス部分は事前に取得したURL情報を利用
  UrlFetchApp.fetch("https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX", options);
}

問題なければ以下のようにSlack上でメッセージを確認できます。

また本対応をすることでbase sheetは不要になります。必要に応じて削除しておきます。

定期的に実行する

こちらは必要に応じて、日次で動かして定期的に新着アプリをチェックしたい場合は以下記事の定期的に実行する欄を参考にGoogleAppsScriptのトリガ登録を実施しましょう。
Stand alone形式でGoogleAppsScriptを作成しgmailでメールを送付する-定期的に実行してみる

タイトルとURLをコピーしました