回答編集履歴

1

2022/02/17 00:35

投稿

tottey1226
tottey1226

スコア19

test CHANGED
@@ -1,387 +1,198 @@
1
1
  //複数の請求書(PDFファイル)に記載してある請求金額を取得し、リスト化するスクリプトを作成してみました。実行時間は3~5分かかります。
2
2
 
3
-
4
-
5
3
  //実現できたこと
6
-
7
4
  //① GASで、特定のフォルダに保存されている複数のPDFを全てGoogleドキュメントに変換
8
-
9
5
  //② ①で変換した複数のGoogleドキュメント(ファイルによって、内容が異なる)から、'調整後請求額(税抜)'と言う文字を検索し、その文字のすぐ右隣に記載されている金額を取得
10
-
11
6
  //③ ②で取得した値(金額)をスプレットシートに貼り付けてリスト化
12
-
13
7
  //④ ①で変換したGoogleドキュメントファイルを削除
14
8
 
15
-
16
-
17
9
  //----注意1 PDFが入っているフォルダと同じ階層にこの実行ファイルを置いておく
18
-
19
10
  //----注意2 PDFが入っているフォルダ内には、余計なファイルは入れない
20
-
21
-
22
11
 
23
12
  //PDF請求書の調整後請求額(税抜)の金額のみを取得してリスト表示するスクリプト
24
13
 
14
+ ```ここに言語を入力
25
15
  function ocrSample() {
26
-
27
16
  var spreadsheet = SpreadsheetApp.getActive();
28
-
29
17
  var ss = SpreadsheetApp.getActiveSpreadsheet();
30
-
31
18
  var sheet = SpreadsheetApp.getActiveSheet();
32
19
 
33
-
34
-
35
20
  //★★フォルダ名がE1のセルに設定されているか判定
36
-
37
21
   var folderNamestr=sheet.getRange('E1').getValue();
38
-
39
22
  // var folder = DriveApp.getFoldersByName('PDF請求書が入っているフォルダ名')
40
-
41
23
  // var sheet = SpreadsheetApp.getActiveSheet();
42
24
 
43
-
44
-
45
25
  //E1のセルにフォルダ名が設定されていなかったら処理を中止して、設定するようメッセージを表示
46
-
47
26
  if (folderNamestr=="") {
48
-
49
27
  Browser.msgBox("【E1】のセルにPDF請求書が入っているフォルダ名を\n 設定してください");
50
-
51
28
  sheet.getRange('E1').activate();
52
-
53
29
  /* 終了処理 */
54
-
55
30
  return;
56
-
57
31
  }
58
32
 
59
-
60
-
61
33
  //フォルダ名とファイルの種類を指定
62
-
63
34
  var folder = DriveApp.getFoldersByName(folderNamestr).next();
64
-
65
35
  var images = folder.getFilesByType('application/pdf'); //PDFを指定
66
-
67
-
68
36
 
69
37
  //上で指定したfolder内のPDFをドキュメントにして保存
70
38
 
39
+ while (images.hasNext()) {
40
+ var image = images.next();
41
+ var docName = image.getName().split(".")[0];
42
+ var Request_body = {
43
+ title: docName,
44
+ mimeType: 'application/pdf' //PDFを指定
45
+ }
71
46
 
47
+ //PDFのファイル内容をGoogleドキュメントにocr機能を使って落とし込む
48
+ Drive.Files.insert(Request_body, image, { ocr: true });
72
49
 
73
- while (images.hasNext()) {
50
+ // Drive.Files.insert(Request_body,application,{ocr:true});
74
51
 
52
+ //PDFのファイル内容をGoogleドキュメント形式で同じフォルダへ保存
75
- var image = images.next();
53
+ var newFile = DriveApp.getFilesByName(docName).next();
54
+ folder.addFile(newFile);
55
+ DriveApp.getRootFolder().removeFile(newFile);
56
+ }
76
57
 
58
+ var docs = folder.getFilesByType('application/vnd.google-apps.document');
59
+ var texts = [];
60
+ while (docs.hasNext()) {
61
+ var file = docs.next();
62
+ var docId = file.getId();
63
+ var doc = DocumentApp.openById(docId);
77
- var docName = image.getName().split(".")[0];
64
+ // var text = doc.getBody().getText().split('\n')[1];
65
+ // texts.push([text]);
66
+ var fname = doc.getName();
78
67
 
68
+ var fnamestr = doc.getBody().getText().split('\n')[1];
79
- var Request_body = {
69
+ texts.push([fname]);
80
70
 
71
+ //Googleドキュメントの税抜の調整後請求額より前の文章を削除
72
+ var text = doc.getBody().getText().replace(/^[\s\S]*調整後請求額\(税抜\)/,"");
81
- title: docName,
73
+ texts.push([text]);
82
74
 
75
+ }
76
+ //ここからスプレットシートでの処理
77
+
78
+ //フィルタがかかっていたらいったん解除する
79
+ //フィルタがかかっている状態では次に実行するすべてのデータクリアがされないため。
80
+ var filter = sheet.getFilter();
81
+
82
+ if( filter == null ){
83
+
84
+ } else {
85
+
83
- mimeType: 'application/pdf' //PDF指定
86
+ sheet.getFilter().remove(); //フィルタオフにする
84
87
 
85
88
  }
86
89
 
87
-
88
-
89
- //PDFのファイル内容をGoogleドキュメントにocr機能を使って落とし込む
90
-
91
- Drive.Files.insert(Request_body, image, { ocr: true });
92
-
93
-
94
-
95
- // Drive.Files.insert(Request_body,application,{ocr:true});
96
-
97
-
98
-
99
- //PDFのファイル内容をGoogleドキュメント形式で同じフォルダへ保存
100
-
101
- var newFile = DriveApp.getFilesByName(docName).next();
102
-
103
- folder.addFile(newFile);
104
-
105
- DriveApp.getRootFolder().removeFile(newFile);
106
-
107
- }
108
-
109
-
110
-
111
- var docs = folder.getFilesByType('application/vnd.google-apps.document');
112
-
113
- var texts = [];
114
-
115
- while (docs.hasNext()) {
116
-
117
- var file = docs.next();
118
-
119
- var docId = file.getId();
120
-
121
- var doc = DocumentApp.openById(docId);
122
-
123
- // var text = doc.getBody().getText().split('\n')[1];
124
-
125
- // texts.push([text]);
126
-
127
- var fname = doc.getName();
128
-
129
-
130
-
131
- var fnamestr = doc.getBody().getText().split('\n')[1];
132
-
133
- texts.push([fname]);
134
-
135
-
136
-
137
- //Googleドキュメントの税抜の調整後請求額より前の文章を削除
138
-
139
- var text = doc.getBody().getText().replace(/^[\s\S]*調整後請求額\(税抜\)/,"");
140
-
141
- texts.push([text]);
142
-
143
-
144
-
145
- }
146
-
147
- //ここからスプレットシートでの処理
148
-
149
-
150
-
151
- //フィルタがかかっていたらいったん解除する
152
-
153
- //フィルタがかかっている状態では次に実行するすべてのデータクリアがされないため。
154
-
155
- var filter = sheet.getFilter();
156
-
157
-
158
-
159
- if( filter == null ){
160
-
161
-
162
-
163
- } else {
164
-
165
-
166
-
167
- sheet.getFilter().remove(); //フィルタをオフにする
168
-
169
-
170
-
171
- }
172
-
173
-
174
-
175
90
  //スプレットシートのA列とB列のデータを初期化する(前回の使用されたものが残っているとおかしくなるので)
176
-
177
91
  // sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).activate();
178
-
179
92
  sheet.getRange(1, 1, sheet.getMaxRows(), 2).activate();
180
-
181
93
  sheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});
182
-
183
94
  sheet.getRange('D1').setValue('請求書が入ったフォルダ名⇒');
184
95
 
185
-
186
-
187
96
  //Googleドキュメントファイルのデータをスプレットシートへ書き込む
188
-
189
97
  sheet.getRange(1,1, texts.length, 1).setValues(texts);
190
98
 
191
-
192
-
193
99
  //このあと、スプレットシートでデータを作成するためのCopyPasteを実行する
194
-
195
100
  CopyPaste();
196
-
197
-
198
101
 
199
102
  //以下、CopyPasteの内容----------
200
103
 
104
+ function CopyPaste() {
105
+ // var spreadsheet = SpreadsheetApp.getActive();
106
+ var ss = SpreadsheetApp.getActiveSpreadsheet();
107
+ var sheet = SpreadsheetApp.getActiveSheet();
108
+ var lastrow = sheet.getLastRow();
109
+ console.log('lastrow:' + lastrow );
110
+
111
+ // //スプレットシートの全てのデータを初期化する
112
+ // sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).activate();
113
+ // sheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});
114
+
115
+ //B2のセルの金額以下の不要な文言を関数で取り除く
116
+ sheet.getRange('B2').activate();
117
+ sheet.getCurrentCell().setFormula('=IFERROR(VALUE(SUBSTITUTE(left(A2,FIND("消費税", A2)-1), CHAR(10), "")),"")');
201
118
 
202
119
 
203
- function CopyPaste() {
120
+ //B2のセルの関数を最終行まで設定する
121
+ sheet.getRange('B2:B'+lastrow).activate();
122
+ sheet.getRange('B2').copyTo(sheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
204
123
 
124
+ //フィルターがかからないため、A列の値のあるセルに文字を挿入
125
+ sheet.getRange('A:A').activate();
205
- // var spreadsheet = SpreadsheetApp.getActive();
126
+ sheet.insertColumnsBefore(sheet.getActiveRange().getColumn(), 1);
127
+ sheet.getRange('A1:A'+lastrow).setValue('1');
206
128
 
207
- var ss = SpreadsheetApp.getActiveSpreadsheet();
129
+ //B列に設定した関数(A列挿入に伴いC列に移動となった)を文字へ置き換える
130
+ sheet.getRange('C2:C'+lastrow).copyTo(sheet.getRange('C1'), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
208
131
 
132
+ //C列の金額を3桁区切り表記にする
133
+ sheet.getRange('C1:C'+lastrow).setNumberFormat('#,##0');
209
- var sheet = SpreadsheetApp.getActiveSheet();
134
+ sheet.deleteRow(lastrow);
210
135
 
136
+ //行を一番上に追加し、ファイル名と、金額の項目を追記する
211
- var lastrow = sheet.getLastRow();
137
+ sheet.insertRows(1,1);
138
+ sheet.getRange('B1').setValue('ファイル名').setHorizontalAlignment('center');
139
+ sheet.getRange('C1').setValue('調整後請求額(税抜)').setHorizontalAlignment('center');
212
140
 
141
+ //フィルタを再度設定する
213
- console.log('lastrow:' + lastrow );
142
+ sheet.getRange(1,1,lastrow,3).createFilter();
214
143
 
144
+ //不要の列削除(フィルタ用に挿入した列を削除)
145
+ sheet.deleteColumns(1, 1);
146
+
147
+ //A列の幅を広げる
148
+ sheet.setColumnWidth(1,160);
215
149
 
150
+ //フィルタで空白以外を表示
151
+ var criteria = SpreadsheetApp.newFilterCriteria()
152
+ .whenCellNotEmpty()
153
+ .build();
154
+ // 空白ではない値のみを表示
155
+ sheet.getFilter().setColumnFilterCriteria(2, criteria);
216
156
 
217
- // //スプレットシートの全てのデータ初期化する
157
+ // 合計値設定する
218
-
158
+ sheet.insertRows(1,1);
219
- // sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).activate();
159
+ // sheet.getRange('A1').setValue('合計').setHorizontalAlignment('center');
220
-
160
+ sheet.getRange('A1').setValue('合計');
161
+
162
+ //B2のセル文字を中央に揃える
221
- // sheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});
163
+ sheet.getRange('A:A').setHorizontalAlignment('center');
222
-
223
164
 
224
165
 
225
166
  //B2のセルの金額以下の不要な文言を関数で取り除く
226
-
227
- sheet.getRange('B2').activate();
228
-
229
- sheet.getCurrentCell().setFormula('=IFERROR(VALUE(SUBSTITUTE(left(A2,FIND("消費税", A2)-1), CHAR(10), "")),"")');
230
-
231
-
232
-
233
-
234
-
235
- //B2のセルの関数を最終行まで設定する
236
-
237
- sheet.getRange('B2:B'+lastrow).activate();
238
-
239
- sheet.getRange('B2').copyTo(sheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
240
-
241
-
242
-
243
- //フィルターがかからないため、A列の値のあるセルに文字を挿入
244
-
245
- sheet.getRange('A:A').activate();
246
-
247
- sheet.insertColumnsBefore(sheet.getActiveRange().getColumn(), 1);
248
-
249
- sheet.getRange('A1:A'+lastrow).setValue('1');
250
-
251
-
252
-
253
- //B列に設定した関数(A列挿入に伴いC列に移動となった)を文字へ置き換える
254
-
255
- sheet.getRange('C2:C'+lastrow).copyTo(sheet.getRange('C1'), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
256
-
257
-
258
-
259
- //C列の金額を3桁区切り表記にする
260
-
261
- sheet.getRange('C1:C'+lastrow).setNumberFormat('#,##0');
262
-
263
- sheet.deleteRow(lastrow);
264
-
265
-
266
-
267
- //行を一番上に追加し、ファイル名と、金額の項目を追記する
268
-
269
- sheet.insertRows(1,1);
270
-
271
- sheet.getRange('B1').setValue('ファイル名').setHorizontalAlignment('center');
272
-
273
- sheet.getRange('C1').setValue('調整後請求額(税抜)').setHorizontalAlignment('center');
274
-
275
-
276
-
277
- //フィルタを再度設定する
278
-
279
- sheet.getRange(1,1,lastrow,3).createFilter();
280
-
281
-
282
-
283
- //不要の列削除(フィルタ用に挿入した列を削除)
284
-
285
- sheet.deleteColumns(1, 1);
286
-
287
-
288
-
289
- //A列の幅を広げる
290
-
291
- sheet.setColumnWidth(1,160);
292
-
293
-
294
-
295
- //フィルタで空白以外を表示
296
-
297
- var criteria = SpreadsheetApp.newFilterCriteria()
298
-
299
- .whenCellNotEmpty()
300
-
301
- .build();
302
-
303
- // 空白ではない値のみを表示
304
-
305
- sheet.getFilter().setColumnFilterCriteria(2, criteria);
306
-
307
-
308
-
309
- // 合計値を設定する
310
-
311
- sheet.insertRows(1,1);
312
-
313
- // sheet.getRange('A1').setValue('合計').setHorizontalAlignment('center');
314
-
315
- sheet.getRange('A1').setValue('合計');
316
-
317
-
318
-
319
- //B2のセル文字を中央に揃える
320
-
321
- sheet.getRange('A:A').setHorizontalAlignment('center');
322
-
323
-
324
-
325
-
326
-
327
- //B2のセルの金額以下の不要な文言を関数で取り除く
328
-
329
167
  sheet.getRange('B1').activate();
330
-
331
168
  sheet.getCurrentCell().setFormula('=sum(B3:B'+lastrow + ')');
332
169
 
333
-
334
-
335
170
  //B2のセル文字が中央へ寄るので、右に揃える
336
-
337
171
  sheet.getRange('B:B').setHorizontalAlignment('right');
338
172
 
339
-
340
-
341
173
  //行を挿入した分ずれるので、フォルダ名を設定したセルをもとのD1:E1へもどす
342
-
343
174
  sheet.getRange(3, 4,1,2).moveTo( sheet.getRange(1, 4) );
344
-
345
-
346
175
 
347
176
  //------作成したGoogleドキュメントファイルたちを削除-----------------------
348
177
 
349
-
350
-
351
178
  //★★フォルダ名(E1)を指定
352
-
353
179
   var folderNamestr=sheet.getRange('E1').getValue();
354
180
 
355
-
356
-
357
181
  //フォルダ名とファイルの種類を指定(ファイルの種類:Google Document)
358
-
359
182
  var folder = DriveApp.getFoldersByName(folderNamestr).next();
360
-
361
183
  var docs = folder.getFilesByType('application/vnd.google-apps.document');
362
184
 
363
-
364
-
365
185
  //作成したGoogle Documentを削除する
366
-
367
186
  while (docs.hasNext()) {
368
-
369
187
  var file = docs.next();
370
-
371
188
  var docId = file.getId();
372
-
373
-
374
189
 
375
190
    file.setTrashed(true)
376
191
 
377
-
378
-
379
192
    }
380
-
381
-
382
193
 
383
194
  Browser.msgBox("請求金額の読込みが完了しました");
384
195
 
196
+ };
385
197
 
386
-
387
- };
198
+ ```