-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathslack.gs
166 lines (153 loc) · 5.98 KB
/
slack.gs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
/**
* 発売リスト一覧のメッセージをSlackに通知する
*/
function releaseListSendMessage() {
// メッセージを作成する
var yearMonth = getYearMonth(0),
year = yearMonth.slice(0,4),
month = yearMonth.slice(4),
message = year + '年' + month + '月の発売リスト';
// スプレッドシートからゲーム情報を取得
var sheet = getSheet(yearMonth),
foundRows = getAllRows(sheet);
// ゲーム情報を元にblocksを作成する
var blocks = buildReleaseListBlocks(sheet, foundRows, message);
// Slackにメッセージを送信する
// var gameSectionCount = 3,
// sendCount = 16;
var gameSectionCount = 2,
sendCount = 25;
additionValue = gameSectionCount * sendCount;
var releaseListTitle = buildSection(buildBoldText(buildLinkText(message, buildListPageUrl(year, month))));
sendMessage(Config.SlackReleaseListWebHookUrl ,[releaseListTitle]);
for($i = 0; $i < blocks.length; $i = $i + additionValue){
// 1回に送信できるsectionの数が50までのため複数回に分けて送信する
// https://api.slack.com/reference/messaging/blocks
sendMessage(Config.SlackReleaseListWebHookUrl ,blocks.slice($i, $i + additionValue));
}
}
/**
* S3へのアップロード完了メッセージをSlackに通知する
* @param {String} [yearMonth] - 年月
*/
function notifyCompleteS3Upload(yearMonth) {
var yearMonthText = yearMonth.slice(0,4) + '年' + yearMonth.slice(4) + '月';
var title = buildBoldText(yearMonthText + 'のデータをS3にアップロードが完了しました') + ' :sparkles:';
var voiceActorsMstText = buildLinkText('・Googleドライブ - 声優マスタ', getVoiceActorsSpreadsheet().getUrl());
var otherThanVoiceActorsMstText = buildLinkText('・Googleドライブ - 声優マスタ以外', getUploadSpreadSheet(yearMonth).getUrl());
var s3Text = buildLinkText('・S3', 'https://console.aws.amazon.com/s3/buckets/' + Config.AwsS3BucketName + '/' + yearMonth + '/');
var blocks = [buildSection(title + ' \n\n ' + voiceActorsMstText + ' \n ' + otherThanVoiceActorsMstText + ' \n ' + s3Text)];
sendMessage(Config.SlackS3UploadCompleteWebHookUrl ,blocks);
}
/**
* Bold用テキストの作成
* @param {String} [text] - テキスト
* @return {String} Boldのテキスト
*/
function buildBoldText(text) {
return '*' + text + '*';
}
/**
* リンクテキストを作成する
* @param {String} [text] - テキスト
* @param {String} [url] - URL
* @return {String} リンクテキスト
*/
function buildLinkText(text, url) {
return (url.trim() == '') ? text : '<' + url + '|' + text + '>';
}
/**
* Secionを作成する
* @param {String} [text] - テキスト
* @return {object} Sectionオブジェクト
*/
function buildSection(text) {
return {
"type": "section",
"text": {
"type": "mrkdwn",
"text": text
}
}
}
/**
* Blocksのゲーム情報用Secionを作成する
* @param {String} [text] - テキスト
* @return {object} ゲーム情報Sectionオブジェクト
*/
function buildGameInfoSection(text) {
return {
"type": "context",
"elements": [
{
"type": "mrkdwn",
"text": text
}
]
}
}
/**
* Blocksの画像Secionを作成する
* @param {String} [text] - テキスト
* @param {String} [altText] - 画像のAlternalText
* @return {object} 画像Sectionオブジェクト
*/
function buildImageSection(url, altText) {
return {
"type": "image",
"image_url": url,
"alt_text": altText
}
}
/**
* 発売リスト通知用のBlocksを作成する
* @param {Sheet} [sheet] - シートObject
* @param {Array} [rows] - 対象のデータ行配列
* @return {object} Blocksオブジェクト
*/
function buildReleaseListBlocks(sheet, rows) {
// 対象のデータを全て取得する
var rowsCount = rows[rows.length - 1] - 1,
values = sheet.getRange(2, 1, rowsCount, maxColumnsCount).getValues()
blocks = [];
// ゲーム情報からメッセージを作成する
values.forEach(function(value) {
var brandName = value[Columns.ArrayValue(Columns.BrandName)],
barandPage = value[Columns.ArrayValue(Columns.BrandPage)],
title = value[Columns.ArrayValue(Columns.Title)],
introductionPage = value[Columns.ArrayValue(Columns.IntroductionPage)],
releaseDate = Utilities.formatDate(value[Columns.ArrayValue(Columns.ReleaseDate)],"JST","yyyy/MM/dd"),
price = value[Columns.ArrayValue(Columns.Price)],
voiceActors = value[Columns.ArrayValue(Columns.VoiceActor)],
packageImage = value[Columns.ArrayValue(Columns.PackageImage)];
var titleText = buildBoldText(buildLinkText(title, introductionPage)) +
' (' + buildBoldText(buildLinkText(brandName, barandPage)) + ')';
var gameInfoText = releaseDate + '\n' + price + '\n' + voiceActors;
blocks.push(buildSection(titleText));
blocks.push(buildGameInfoSection(gameInfoText));
// リファラーがげっちゅ屋でないと「Forbidden」になるように設定されているっぽいので
// 直リンクができないようになったので画像のリンクを貼る処理はなくす
// blocks.push(buildImageSection(packageImage, title));
// blocks.push(buildSection(packageImage));
});
return blocks;
}
/**
* Slackのチャンネルにメッセージを送信する
* @param {String} [slackwebHookUrl] - SlackのWebHookURL
* @param {Array} [blocks] - blocksオブジェクト
*/
function sendMessage(slackwebHookUrl, blocks) {
var payload = {
blocks: blocks,
};
var option = {
'method': 'post',
'payload': JSON.stringify(payload),
'contentType': 'application/x-www-form-urlencoded; charset=utf-8',
'muteHttpExceptions': true
};
// Slackにメッセージを送信
var response = UrlFetchApp.fetch(slackwebHookUrl, option);
Logger.log(response);
}