Last active
January 1, 2022 03:03
AppStoreのレビューを毎日Slackに通知するGAS https://qiita.com/saikei/items/82cb9647fdabeffad1cd
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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