-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy paths3Upload.gs
182 lines (154 loc) · 6.87 KB
/
s3Upload.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
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
/**
* 今月のデータをS3にアップロードする
*/
function allUploadThisMonth(){
allUpload(getNowYearMonth());
}
/**
* S3にすべての情報をアップロードする
* アップロード対象のデータ
* ・声優情報
* ・ゲーム情報
* ・ゲームの出演情報
* ・ブランド情報
* @param {String} [yearMonth] - 年月文字列
*/
function allUpload(yearMonth){
// アップロード用ファイルの作成
writeVoiceActorsInfo(yearMonth);
createS3UploadFiles(yearMonth);
// 声優情報をアップロード
var voiceActorsData = VoiceActorsSheet.getRange(2, 1, VoiceActorsSheet.getLastRow() - 1, VoiceActorsSheet.getLastColumn()).getValues();
var voiceActorsCsv = buildCSV(voiceActorsData);
uploadCsvToS3(buildUploadPath(yearMonth, 'voice_actors') ,voiceActorsCsv);
var ss = getUploadSpreadSheet(yearMonth);
// ゲーム情報をアップロード
var gamesSheet = getSheet('games', ss);
var gamesData = gamesSheet.getRange(2, 1, gamesSheet.getLastRow() - 1, gamesSheet.getLastColumn()).getValues();
var gamesCsv = buildCSV(gamesData);
uploadCsvToS3(buildUploadPath(yearMonth, 'games') ,gamesCsv);
// ゲームの出演情報をアップロード
var gameCastsSheet = getSheet('game_casts', ss);
var gameCastsData = gameCastsSheet.getRange(2, 1, gameCastsSheet.getLastRow() - 1, 2).getValues();
var gameCastsCsv = buildCSV(gameCastsData);
uploadCsvToS3(buildUploadPath(yearMonth, 'game_casts'), gameCastsCsv);
// ブランド情報をアップロード
var brandsSheet = getSheet('brands', ss);
var brandsData = brandsSheet.getRange(2, 1, brandsSheet.getLastRow() - 1, brandsSheet.getLastColumn()).getValues();
var brandsCsv = buildCSV(brandsData);
uploadCsvToS3(buildUploadPath(yearMonth, 'brands'), brandsCsv);
// S3アップロード完了通知をSlackに通知させる
notifyCompleteS3Upload(yearMonth);
}
/**
* アップロード対象のスプレッドシートを取得する
* @param {String} [yearMonth] - 年月文字列
* @return {Sheet} Googleスプレッドシートのシートオブジェクト
*/
function getUploadSpreadSheet(yearMonth){
var targetFolder = getFolderForErogeReleaseBot(yearMonth);
return getSpreadSheetForErogeReleaseBot(targetFolder, yearMonth);
}
/**
* アップロード用のパスを生成する
* @param {String} [yearMonth] - 年月文字列
* @param {String} [csvFileName] - csvファイル名
* @return {String} アップロード先パス
*/
function buildUploadPath(yearMonth, csvFileName) {
return yearMonth + '/' + csvFileName + '.csv';
}
/**
* CSVファイルをS3にアップロードする
* @param {String} [filePath] - ファイルパス
* @param {Blob} - CSV用のBlogオブジェクト
*/
function uploadCsvToS3(filePath, csv) {
var s3 = S3.getInstance(Config.AwsAccessKeyID, Config.AwsSecretAccessKey);
result = s3.putObject(Config.AwsS3BucketName, filePath, csv, {logRequests:true});
console.info(result);
}
/**
* S3にアップロードするようのファイルにへの書き込み処理を行う
* @param {String} [sheetName] - データを取得するシート名
*/
function createS3UploadFiles(sheetName){
// ブランド・ゲームの出演情報・ゲーム情報を書き込む
var createSpreadSheetResult = createSpreadSheet(sheetName, sheetName);
var ss = SpreadsheetApp.openById(createSpreadSheetResult["id"]);
createBrandsSheet(ss, sheetName);
createGameCasts(ss, sheetName);
createGamesSheet(ss, sheetName);
}
/**
* brandsシートの書き込み処理
* @param {Spreadsheet} [spreadSheet] - SpreadsheetObject
* @param {String} [sheetName] - データを取得するシート名
*/
function createBrandsSheet(spreadSheet, sheetName) {
var sheet = createSheet(spreadSheet, "brands");
// ヘッダー行の書き込み
sheet.getRange(1, 1).setValue('ブランドID');
sheet.getRange(1, 2).setValue('ブランド名');
sheet.getRange(1, 3).setValue('ブランドURL');
var datas = getEliminateDuplicationData(sheetName);
datas.forEach(function(data, index){
// indexが0始まりなので+1、ヘッダー行より下に書き込むのでさらに+1
row = index + 1 + 1;
sheet.getRange(row, 1).setValue(data[Columns.ArrayValue(Columns.BrandID)]);
sheet.getRange(row, 2).setValue(data[Columns.ArrayValue(Columns.BrandName)]);
sheet.getRange(row, 3).setValue(data[Columns.ArrayValue(Columns.BrandPage)]);
});
// 重複データを削除する
var writedDatas = sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn());
writedDatas.removeDuplicates();
}
/**
* game_castsシートの書き込み処理
* @param {Spreadsheet} [spreadSheet] - SpreadsheetObject
* @param {String} [sheetName] - データを取得するシート名
*/
function createGameCasts(spreadSheet, sheetName) {
var sheet = createSheet(spreadSheet, "game_casts");
// ヘッダー行の書き込み
sheet.getRange(1, 1).setValue('ゲームID');
sheet.getRange(1, 2).setValue('声優ID');
sheet.getRange(1, 3).setValue('声優名');
var voiceActorDatas = getVoiceActorsByGameID(sheetName);
var rowIndex = 2; // ヘッダー行より下に書き込むのでさらに2始まりとする
Object.keys(voiceActorDatas).forEach(function(gameID){
voiceActorDatas[gameID].forEach(function(voiceActor){
sheet.getRange(rowIndex, 1).setValue(gameID);
sheet.getRange(rowIndex, 2).setValue(getVoiceActorID(voiceActor));
sheet.getRange(rowIndex, 3).setValue(voiceActor);
rowIndex = rowIndex + 1;
});
});
}
/**
* gamesシートの書き込み処理
* @param {Spreadsheet} [spreadSheet] - SpreadsheetObject
* @param {String} [sheetName] - データを取得するシート名
*/
function createGamesSheet(spreadSheet, sheetName) {
var sheet = createSheet(spreadSheet, "games");
// ヘッダー行の書き込み
sheet.getRange(1, 1).setValue('ゲームID');
sheet.getRange(1, 2).setValue('タイトル');
sheet.getRange(1, 3).setValue('ブランドID');
sheet.getRange(1, 4).setValue('発売日');
sheet.getRange(1, 5).setValue('ゲーム紹介ページ');
var datas = getEliminateDuplicationData(sheetName);
datas.forEach(function(data, index){
// indexが0始まりなので+1、ヘッダー行より下に書き込むのでさらに+1
row = index + 1 + 1;
// スクレイピングで変な文字列を取得されてしまうため末尾の文字を削除する
var title = data[Columns.ArrayValue(Columns.Title)];
if (title.slice(-1) == ' ') title = title.slice(0, -1);
sheet.getRange(row, 1).setValue(data[Columns.ArrayValue(Columns.ID)]);
sheet.getRange(row, 2).setValue(title);
sheet.getRange(row, 3).setValue(data[Columns.ArrayValue(Columns.BrandID)]);
sheet.getRange(row, 4).setValue(data[Columns.ArrayValue(Columns.ReleaseDate)]);
sheet.getRange(row, 5).setValue(data[Columns.ArrayValue(Columns.IntroductionPage)]);
});
}