@@ -29,7 +29,7 @@ const distAssetsFilePath = path.resolve(distAssetsDirectoryPath, jsonFileNa
29
29
const json = parseToJson ( result ) ;
30
30
31
31
// 見出し行からフォーマットをチェックする
32
- const header = json . values . shift ( ) ; // データの先頭1行が見出し・ココで ` json.values` の先頭行を削除している
32
+ const header = json . values . shift ( ) ; // データの先頭1行が見出し・ココで json.values の先頭行が削除される
33
33
validateHeaderColumns ( header ) ;
34
34
35
35
// 映画情報一覧に変換・ソートする
@@ -91,7 +91,7 @@ async function fetch(url) {
91
91
return result ;
92
92
}
93
93
catch ( error ) {
94
- console . error ( 'Failed To Request' ) ;
94
+ console . error ( 'Failed To Request' , error ) ;
95
95
throw error ;
96
96
}
97
97
}
@@ -129,11 +129,11 @@ function parseToJson(text) {
129
129
* 取得したスプレッドシートの1行目を確認し、正しいフォーマットかどうか確認する
130
130
*
131
131
* @param {Array<string> } header ヘッダ行
132
- * @return {boolean } 列数・ 列名・列順が全て正しければ true
132
+ * @return {boolean } 列名・列順が全て正しければ true
133
133
* @throws 不正なフォーマットだった場合
134
134
*/
135
135
function validateHeaderColumns ( header ) {
136
- /** 見出し行データとして想定する文言 */
136
+ /** 見出し行として想定する列順と文言・現状は英語表記が合致する想定 */
137
137
const expectedHeader = [
138
138
[ 'Published Year' , '公開年' ] ,
139
139
[ 'Title' , '原題' ] ,
@@ -142,20 +142,18 @@ function validateHeaderColumns(header) {
142
142
[ 'Review' , '感想' ] ,
143
143
[ 'Casts' , 'キャスト' ] ,
144
144
[ 'Staffs' , 'スタッフ' ] ,
145
- [ 'Tags' , 'タグ' ]
145
+ [ 'Tags' , 'タグ' ] // コレ以降に列が存在しても無視する
146
146
] ;
147
147
148
- // 列数が一致していること
149
- if ( expectedHeader . length !== header . length ) {
150
- console . error ( `Number Of Header Columns Is Invalid` , { expectedHeaderLength : expectedHeader . length , headerLength : header . length , header : header } ) ;
151
- throw new Error ( 'Number Of Header Columns Is Invalid' ) ;
152
- }
153
-
154
- // 全ての列名について想定文言のいずれかに合致すること
155
- const isValid = header . every ( ( columnName , index ) => {
156
- return expectedHeader [ index ] . some ( ( expectedColumnName ) => columnName === expectedColumnName ) ;
148
+ // ヘッダ行の各列について想定文言のいずれかに合致すること
149
+ const isValid = expectedHeader . every ( ( expectedColumnValues , index ) => {
150
+ const columnValue = header [ index ] ;
151
+ return expectedColumnValues . some ( ( expectedColumnValue ) => columnValue === expectedColumnValue ) ;
157
152
} ) ;
158
- if ( ! isValid ) throw new Error ( 'Invalid Header Columns' ) ;
153
+ if ( ! isValid ) {
154
+ console . error ( 'Invalid Header Columns' , header ) ;
155
+ throw new Error ( 'Invalid Header Columns' ) ;
156
+ }
159
157
160
158
return isValid ;
161
159
}
@@ -168,26 +166,27 @@ function validateHeaderColumns(header) {
168
166
*/
169
167
function convertToFilms ( values ) {
170
168
return values . map ( ( row , index ) => {
171
- // 「公開年」と「原題」は必須とする・後続が空値のみの列のみだと配列の要素ごと少なくなる
169
+ // 「公開年」と「原題」の2列は必須とする・後続列が空値のみだと配列の要素ごと少なくなる
172
170
if ( row . length < 2 ) {
173
171
console . error ( 'Invalid Row Data' , { index, row } ) ;
174
172
throw new Error ( 'Invalid Row Data' ) ;
175
173
}
176
- // 1列目のデータが数値型に変換できなければ不正値とみなす
177
- if ( Number . isNaN ( Number ( row [ 0 ] ) ) ) {
174
+ // 1列目のデータ (公開年) が数値型に変換できなければ不正値とみなす
175
+ const publishedYear = Number ( row [ 0 ] ) ;
176
+ if ( Number . isNaN ( publishedYear ) ) {
178
177
console . error ( 'Invalid Published Year Data' , { index, row } ) ;
179
178
throw new Error ( 'Invalid Published Year Data' ) ;
180
179
}
181
180
182
- return { // Film クラス相当の連想配列にする・空白や改行は除去する
183
- publishedYear : Number ( row [ 0 ] ) ,
184
- title : row [ 1 ] == null ? '' : String ( row [ 1 ] ) . trim ( ) . replace ( ( / \n / gu ) , '' ) ,
185
- japaneseTitle : row [ 2 ] == null ? '' : String ( row [ 2 ] ) . trim ( ) . replace ( ( / \n / gu ) , '' ) ,
186
- scenario : row [ 3 ] == null ? '' : String ( row [ 3 ] ) . trim ( ) . replace ( ( / \n / gu ) , '' ) ,
187
- review : row [ 4 ] == null ? '' : String ( row [ 4 ] ) . trim ( ) . replace ( ( / \n / gu ) , '' ) ,
188
- casts : row [ 5 ] == null ? '' : String ( row [ 5 ] ) . trim ( ) . replace ( ( / \n / gu ) , '' ) ,
189
- staffs : row [ 6 ] == null ? '' : String ( row [ 6 ] ) . trim ( ) . replace ( ( / \n / gu ) , '' ) ,
190
- tags : row [ 7 ] == null ? '' : String ( row [ 7 ] ) . trim ( ) . replace ( ( / \n / gu ) , '' )
181
+ return { // Film クラス相当の連想配列にする
182
+ publishedYear : publishedYear ,
183
+ title : convertToOneLineString ( row [ 1 ] ) ,
184
+ japaneseTitle : convertToOneLineString ( row [ 2 ] ) ,
185
+ scenario : convertToOneLineString ( row [ 3 ] ) ,
186
+ review : convertToOneLineString ( row [ 4 ] ) ,
187
+ casts : convertToOneLineString ( row [ 5 ] ) ,
188
+ staffs : convertToOneLineString ( row [ 6 ] ) ,
189
+ tags : convertToOneLineString ( row [ 7 ] )
191
190
} ;
192
191
} )
193
192
. sort ( ( filmA , filmB ) => {
@@ -200,6 +199,17 @@ function convertToFilms(values) {
200
199
// 同一値なら 0 を返す
201
200
return 0 ;
202
201
} ) ;
202
+
203
+ /**
204
+ * セルの値を文字列に変換し空白や改行を除去する
205
+ * Google スプレッドシート API はセルの値を必ず文字列型で返すようだが念のため String() で文字列化しておく
206
+ *
207
+ * @param {string|number|null|undefined } value 値
208
+ * @return {string } 値が存在しない場合は空文字・値が存在すれば空白をトリムし改行を除去した文字列
209
+ */
210
+ function convertToOneLineString ( value ) {
211
+ return value == null ? '' : String ( value ) . trim ( ) . replace ( ( / \n / gu) , '' ) ;
212
+ }
203
213
}
204
214
205
215
/**
0 commit comments