Skip to content

Instantly share code, notes, and snippets.

@saikei718
Last active January 1, 2022 03:03
Show Gist options
  • Save saikei718/254d959c0878f3335acae4d0a75d0912 to your computer and use it in GitHub Desktop.
Save saikei718/254d959c0878f3335acae4d0a75d0912 to your computer and use it in GitHub Desktop.
AppStoreのレビューを毎日Slackに通知するGAS https://qiita.com/saikei/items/82cb9647fdabeffad1cd
// App ID 設定
var appID = 999999999;
// Slack 設定
var slackWebhookURL = "https://hooks.slack.com/services/xxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
var slackChannel = "#bot-AppReview";
var slackUsername = "アプリレビューお知らせBot";
var slackIcon = ":robot_face:";
// 実行日
var dateToday = new Date();
// 取得対象日
var dateYesterday = new Date();
dateYesterday.setDate(dateYesterday.getDate() - 1);
dateYesterday.setHours(0);
dateYesterday.setMinutes(0);
dateYesterday.setSeconds(0);
var yesterdayStr = dateYesterday.getFullYear() + "/" + (dateYesterday.getMonth() + 1) + "/" + (("0" + dateYesterday.getDate()).slice(-2));
// 記録シート設定
var sheet = SpreadsheetApp.getActiveSheet();
function getAppStoreReview() {
var feedURL = "https://itunes.apple.com/jp/rss/customerreviews/id=" + appID + "/sortBy=mostRecent/xml";
var response = UrlFetchApp.fetch(feedURL),
xml = XmlService.parse(response.getContentText()),
namespace = xml.getRootElement().getNamespace(),
appleNameSpace = xml.getRootElement().getNamespace("im"),
entries = xml.getRootElement().getChildren("entry", namespace),
length = entries.length,
data = [];
for (var i = 0; i < length - 1; i++) {
var args = [];
// 投稿日時
var updated = new Date(entries[i].getChildText("updated", namespace));
var updatedStr = Utilities.formatDate(updated, "JST", "yyyy/MM/dd HH:mm:ss");
// 前日分のみ取得
if (updated.getDate() == dateToday.getDate()) {
Logger.info("取得対象外");
continue;
} else if (updated < dateYesterday) {
var log = "【終了】合計件数:" + data.length;
Logger.info(log);
break;
} else {
// 投稿者名
var name = entries[i].getChildren("author", namespace)[0].getChildText("name", namespace);
// レート
var rating = entries[i].getChildText("rating", appleNameSpace);
// タイトル
var title = entries[i].getChildText("title", namespace);
// コメント
var content = entries[i].getChildText("content", namespace);
// 配列に追加
args.push(updatedStr);
args.push(name);
args.push(rating);
args.push(title);
args.push(content);
data.unshift(args);
}
}
if (data.length > 0) {
// スプレッドシートの最終行に追記
var lastRow = sheet.getLastRow();
sheet.getRange(lastRow + 1, 1, data.length, data[0].length).setValues(data);
// Slack投稿用Payloadを作成
var postToSlackPayload = buildMessage(data.length, data);
// Slackに投稿する
postToSlack(postToSlackPayload);
} else {
var nonReviewMessage = {
"channel": slackChannel,
"username": slackUsername,
"icon_emoji": slackIcon,
"text": ":star: 昨日(" + yesterdayStr + ")新たなレビューはありませんでした。"
}
postToSlack(nonReviewMessage);
}
}
function buildMessage(length, data) {
// 送信メッセージ
var postMessageBlocks = [];
// 区切り線
var divider = {
"type": "divider"
}
// メッセージヘッダー(日付・件数)
var message_header = {
"type": "section",
"text": {
"type": "mrkdwn",
"text": ":star: 昨日(" + yesterdayStr + ")新たに *" + length + "件* のレビューが投稿されました。"
}
}
postMessageBlocks.push(message_header);
// 区切り線の挿入
postMessageBlocks.push(divider);
for (var i = 0; i < length; i++) {
// ユーザーレビュー(名前・レート・タイトル・内容)
var userReview = {
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*" + data[i][3] + "*\n" + convertRating(data[i][2]) + " by." + data[i][1] + "\n" + data[i][4]
}
}
postMessageBlocks.push(userReview);
// ユーザーレビューフッター(投稿日時)
var userReviewDateFooter = {
"type": "context",
"elements": [{
"type": "plain_text",
"text": "at " + data[i][0]
}]
}
postMessageBlocks.push(userReviewDateFooter);
// 区切り線の挿入
postMessageBlocks.push(divider);
}
// payloadを作成
var postMessage = {
"channel": slackChannel,
"username": slackUsername,
"icon_emoji": slackIcon,
"text": ":star: 昨日(" + yesterdayStr + ")新たに " + length + "件 のレビューが投稿されました",
"blocks": postMessageBlocks
}
return postMessage;
}
// SlackのWebHookにメッセージをPOSTする
function postToSlack(message) {
var params = {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify(message)
};
UrlFetchApp.fetch(slackWebhookURL, params);
}
// レビューの星の数を数値から文字列に変換する
function convertRating(rating) {
switch (rating) {
case '1':
return '★☆☆☆☆';
case '2':
return '★★☆☆☆';
case '3':
return '★★★☆☆';
case '4':
return '★★★★★';
case '5':
return '★★★★★';
default:
return '-';
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment