teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

2022/02/17 00:35

投稿

tottey1226
tottey1226

スコア19

answer CHANGED
@@ -1,194 +1,198 @@
1
- //複数の請求書(PDFファイル)に記載してある請求金額を取得し、リスト化するスクリプトを作成してみました。実行時間は3~5分かかります。
2
-
3
- //実現できたこと
4
- //① GASで、特定のフォルダに保存されている複数のPDFを全てGoogleドキュメントに変換
5
- //② ①で変換した複数のGoogleドキュメント(ファイルによって、内容が異なる)から、'調整後請求額(税抜)'と言う文字を検索し、その文字のすぐ右隣に記載されている金額を取得
6
- //③ ②で取得した値(金額)をスプレットシートに貼り付けてリスト化
7
- //④ ①で変換したGoogleドキュメントファイルを削除
8
-
9
- //----注意1 PDFが入っているフォルダと同じ階層にこの実行ファイルを置いておく
10
- //----注意2 PDFが入っているフォルダ内には、余計なファイルは入れない
11
-
12
- //PDF請求書の調整後請求額(税抜)の金額のみを取得してリスト表示するスクリプト
13
- function ocrSample() {
14
- var spreadsheet = SpreadsheetApp.getActive();
15
- var ss = SpreadsheetApp.getActiveSpreadsheet();
16
- var sheet = SpreadsheetApp.getActiveSheet();
17
-
18
- //★★フォルダ名がE1のセルに設定されているか判定
19
-  var folderNamestr=sheet.getRange('E1').getValue();
20
- // var folder = DriveApp.getFoldersByName('PDF請求書が入っているフォルダ名')
21
- // var sheet = SpreadsheetApp.getActiveSheet();
22
-
23
- //E1のセルにフォルダ名が設定されていなかったら処理を中止して、設定するようメッセージを表示
24
- if (folderNamestr=="") {
25
- Browser.msgBox("【E1のセルにPDF請求書が入っているフォルダ名を\n 設定してください");
26
- sheet.getRange('E1').activate();
27
- /* 終了処理 */
28
- return;
29
- }
30
-
31
- //フォルダ名とファイルの種類を指定
32
- var folder = DriveApp.getFoldersByName(folderNamestr).next();
33
- var images = folder.getFilesByType('application/pdf'); //PDFを指定
34
-
35
- //上で指定したfolder内のPDFをドキュメントにして保存
36
-
37
- while (images.hasNext()) {
38
- var image = images.next();
39
- var docName = image.getName().split(".")[0];
40
- var Request_body = {
41
- title: docName,
42
- mimeType: 'application/pdf' //PDFを指定
43
- }
44
-
45
- //PDFのファイル内容をGoogleドキュメントにocr機能を使って落とし込む
46
- Drive.Files.insert(Request_body, image, { ocr: true });
47
-
48
- // Drive.Files.insert(Request_body,application,{ocr:true});
49
-
50
- //PDFのファイル内容をGoogleドキュメント形式で同じフォルダへ保存
51
- var newFile = DriveApp.getFilesByName(docName).next();
52
- folder.addFile(newFile);
53
- DriveApp.getRootFolder().removeFile(newFile);
54
- }
55
-
56
- var docs = folder.getFilesByType('application/vnd.google-apps.document');
57
- var texts = [];
58
- while (docs.hasNext()) {
59
- var file = docs.next();
60
- var docId = file.getId();
61
- var doc = DocumentApp.openById(docId);
62
- // var text = doc.getBody().getText().split('\n')[1];
63
- // texts.push([text]);
64
- var fname = doc.getName();
65
-
66
- var fnamestr = doc.getBody().getText().split('\n')[1];
67
- texts.push([fname]);
68
-
69
- //Googleドキュメントの税抜の調整後請求額より前の文章を削除
70
- var text = doc.getBody().getText().replace(/^[\s\S]*調整後請求額\(税抜\)/,"");
71
- texts.push([text]);
72
-
73
- }
74
- //ここからスプレットシートでの処理
75
-
76
- //フィルタがかっていたいったん解除する
77
- //フィルタがかかっている状態では次に実行するすべてのデータクリアがされないため。
78
- var filter = sheet.getFilter();
79
-
80
- if( filter == null ){
81
-
82
- } else {
83
-
84
- sheet.getFilter().remove(); //フィルタをオフにする
85
-
86
- }
87
-
88
- //スプレットシートのA列とB列のデータを初期化する(前回の使用されたものが残っているとおかしくなるので)
89
- // sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).activate();
90
- sheet.getRange(1, 1, sheet.getMaxRows(), 2).activate();
91
- sheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});
92
- sheet.getRange('D1').setValue('請求書が入ったフォルダ名⇒');
93
-
94
- //Googleドキュメントァイのデータをスプレットシートへ書き込む
95
- sheet.getRange(1,1, texts.length, 1).setValues(texts);
96
-
97
- //このあと、スプレットシートでデータを作成するためのCopyPasteを実行する
98
- CopyPaste();
99
-
100
- //以下、CopyPasteの内容----------
101
-
102
- function CopyPaste() {
103
- // var spreadsheet = SpreadsheetApp.getActive();
104
- var ss = SpreadsheetApp.getActiveSpreadsheet();
105
- var sheet = SpreadsheetApp.getActiveSheet();
106
- var lastrow = sheet.getLastRow();
107
- console.log('lastrow:' + lastrow );
108
-
109
- // //スプレットシートの全てのデータを初期化する
110
- // sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).activate();
111
- // sheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});
112
-
113
- //B2のセルの金額以下の不要な文言を関数で取り除く
114
- sheet.getRange('B2').activate();
115
- sheet.getCurrentCell().setFormula('=IFERROR(VALUE(SUBSTITUTE(left(A2,FIND("消費税", A2)-1), CHAR(10), "")),"")');
116
-
117
-
118
- //B2のセルの関数を最終行まで設定する
119
- sheet.getRange('B2:B'+lastrow).activate();
120
- sheet.getRange('B2').copyTo(sheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
121
-
122
- //フィルターがかからないため、A列の値のあるセルに文字を挿入
123
- sheet.getRange('A:A').activate();
124
- sheet.insertColumnsBefore(sheet.getActiveRange().getColumn(), 1);
125
- sheet.getRange('A1:A'+lastrow).setValue('1');
126
-
127
- //B列に設定した関数(A列挿入に伴いC列に移動となった)を文字へ置き換える
128
- sheet.getRange('C2:C'+lastrow).copyTo(sheet.getRange('C1'), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
129
-
130
- //C列の金額を3桁区切り表記にする
131
- sheet.getRange('C1:C'+lastrow).setNumberFormat('#,##0');
132
- sheet.deleteRow(lastrow);
133
-
134
- //行を一番上に追加し、ファイル名と、金額の項目を追記する
135
- sheet.insertRows(1,1);
136
- sheet.getRange('B1').setValue('ファイル名').setHorizontalAlignment('center');
137
- sheet.getRange('C1').setValue('調整後請求額(税抜)').setHorizontalAlignment('center');
138
-
139
- //フィルタを再度設定する
140
- sheet.getRange(1,1,lastrow,3).createFilter();
141
-
142
- //不要の列削除(フィルタ用に挿入した列を削除)
143
- sheet.deleteColumns(1, 1);
144
-
145
- //A列の幅を広げる
146
- sheet.setColumnWidth(1,160);
147
-
148
- //フィルタで空白以外を表示
149
- var criteria = SpreadsheetApp.newFilterCriteria()
150
- .whenCellNotEmpty()
151
- .build();
152
- // 空白ではない値のみを表示
153
- sheet.getFilter().setColumnFilterCriteria(2, criteria);
154
-
155
- // 合計値を設定する
156
- sheet.insertRows(1,1);
157
- // sheet.getRange('A1').setValue('合計').setHorizontalAlignment('center');
158
- sheet.getRange('A1').setValue('合計');
159
-
160
- //B2のセル文字を中央に揃える
161
- sheet.getRange('A:A').setHorizontalAlignment('center');
162
-
163
-
164
- //B2のセルの金額以下の不要な文言を関数で取り除く
165
- sheet.getRange('B1').activate();
166
- sheet.getCurrentCell().setFormula('=sum(B3:B'+lastrow + ')');
167
-
168
- //B2のセル文字が中央へ寄るので、右に揃える
169
- sheet.getRange('B:B').setHorizontalAlignment('right');
170
-
171
- //行を挿入した分ずれるので、フォルダ名を設定したセルをもとのD1:E1へもどす
172
- sheet.getRange(3, 4,1,2).moveTo( sheet.getRange(1, 4) );
173
-
174
- //------作成したGoogleドキュメントファイルたちを削除-----------------------
175
-
176
- //★★ダ名(E1)指定
177
-  var folderNamestr=sheet.getRange('E1').getValue();
178
-
179
- //フォルダ名とファイルの種類を指定(ファイルの種類:Google Document)
180
- var folder = DriveApp.getFoldersByName(folderNamestr).next();
181
- var docs = folder.getFilesByType('application/vnd.google-apps.document');
182
-
183
- //作成したGoogle Documentを削除する
184
- while (docs.hasNext()) {
185
- var file = docs.next();
186
- var docId = file.getId();
187
-
188
-   file.setTrashed(true)
189
-
190
-   }
191
-
192
- Browser.msgBox("請求金額の読込みが完了しました");
193
-
194
- };
1
+ //複数の請求書(PDFファイル)に記載してある請求金額を取得し、リスト化するスクリプトを作成してみました。実行時間は3~5分かかります。
2
+
3
+ //実現できたこと
4
+ //① GASで、特定のフォルダに保存されている複数のPDFを全てGoogleドキュメントに変換
5
+ //② ①で変換した複数のGoogleドキュメント(ファイルによって、内容が異なる)から、'調整後請求額(税抜)'と言う文字を検索し、その文字のすぐ右隣に記載されている金額を取得
6
+ //③ ②で取得した値(金額)をスプレットシートに貼り付けてリスト化
7
+ //④ ①で変換したGoogleドキュメントファイルを削除
8
+
9
+ //----注意1 PDFが入っているフォルダと同じ階層にこの実行ファイルを置いておく
10
+ //----注意2 PDFが入っているフォルダ内には、余計なファイルは入れない
11
+
12
+ //PDF請求書の調整後請求額(税抜)の金額のみを取得してリスト表示するスクリプト
13
+
14
+ ```ここに言語を入力
15
+ function ocrSample() {
16
+ var spreadsheet = SpreadsheetApp.getActive();
17
+ var ss = SpreadsheetApp.getActiveSpreadsheet();
18
+ var sheet = SpreadsheetApp.getActiveSheet();
19
+
20
+ //★★フォルダ名がE1のセルに設定されているか判定
21
+  var folderNamestr=sheet.getRange('E1').getValue();
22
+ // var folder = DriveApp.getFoldersByName('PDF請求書が入っているフォルダ名')
23
+ // var sheet = SpreadsheetApp.getActiveSheet();
24
+
25
+ //E1のセルにフォルダ名設定されてなかったら処理を中止して、設定するようメッセージを表示
26
+ if (folderNamestr=="") {
27
+ Browser.msgBox("【E1】のセルにPDF請求書が入っているフォルダ名を\n 設定してください");
28
+ sheet.getRange('E1').activate();
29
+ /* 終了処理 */
30
+ return;
31
+ }
32
+
33
+ //フォルダ名とファイルの種類を指定
34
+ var folder = DriveApp.getFoldersByName(folderNamestr).next();
35
+ var images = folder.getFilesByType('application/pdf'); //PDFを指定
36
+
37
+ //上で指定したfolder内のPDFをドキュメントにして保存
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
+ }
46
+
47
+ //PDFのファイル内容をGoogleドキュメントにocr機能を使って落とし込む
48
+ Drive.Files.insert(Request_body, image, { ocr: true });
49
+
50
+ // Drive.Files.insert(Request_body,application,{ocr:true});
51
+
52
+ //PDFのファイル内容をGoogleドキュメント形式で同じフォルダへ保存
53
+ var newFile = DriveApp.getFilesByName(docName).next();
54
+ folder.addFile(newFile);
55
+ DriveApp.getRootFolder().removeFile(newFile);
56
+ }
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);
64
+ // var text = doc.getBody().getText().split('\n')[1];
65
+ // texts.push([text]);
66
+ var fname = doc.getName();
67
+
68
+ var fnamestr = doc.getBody().getText().split('\n')[1];
69
+ texts.push([fname]);
70
+
71
+ //Googleドキュメントの税抜の調整後請求額より前の文章を削除
72
+ var text = doc.getBody().getText().replace(/^[\s\S]*調整後請求額\(税抜\)/,"");
73
+ texts.push([text]);
74
+
75
+ }
76
+ //ここからスプレットシートでの処理
77
+
78
+ //フィルタがかかっていたらいったん解除する
79
+ //フィルタがかかっている状態では次に実行するすべてのデータクリアがされないため。
80
+ var filter = sheet.getFilter();
81
+
82
+ if( filter == null ){
83
+
84
+ } else {
85
+
86
+ sheet.getFilter().remove(); //フィルタをオフにする
87
+
88
+ }
89
+
90
+ //スプレットシートのA列とB列のデータを初期化する(前回の使用されたものが残っているとおかしくなるので)
91
+ // sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).activate();
92
+ sheet.getRange(1, 1, sheet.getMaxRows(), 2).activate();
93
+ sheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});
94
+ sheet.getRange('D1').setValue('請求書が入ったダ名⇒');
95
+
96
+ //Googleドキュメントファイルのデータをスプレットシートへ書き込む
97
+ sheet.getRange(1,1, texts.length, 1).setValues(texts);
98
+
99
+ //このあと、スプレットシートでデータを作成するためのCopyPasteを実行する
100
+ CopyPaste();
101
+
102
+ //以下、CopyPasteの内容----------
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), "")),"")');
118
+
119
+
120
+ //B2のセルの関数を最終行まで設定する
121
+ sheet.getRange('B2:B'+lastrow).activate();
122
+ sheet.getRange('B2').copyTo(sheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
123
+
124
+ //フィルターがかからないため、A列の値のあるセルに文字を挿入
125
+ sheet.getRange('A:A').activate();
126
+ sheet.insertColumnsBefore(sheet.getActiveRange().getColumn(), 1);
127
+ sheet.getRange('A1:A'+lastrow).setValue('1');
128
+
129
+ //B列に設定した関数(A列挿入に伴いC列に移動となった)を文字へ置き換える
130
+ sheet.getRange('C2:C'+lastrow).copyTo(sheet.getRange('C1'), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
131
+
132
+ //C列の金額を3桁区切り表記にする
133
+ sheet.getRange('C1:C'+lastrow).setNumberFormat('#,##0');
134
+ sheet.deleteRow(lastrow);
135
+
136
+ //行を一番上に追加し、ファイル名と、金額の項目を追記する
137
+ sheet.insertRows(1,1);
138
+ sheet.getRange('B1').setValue('ファイル名').setHorizontalAlignment('center');
139
+ sheet.getRange('C1').setValue('調整後請求額(税抜)').setHorizontalAlignment('center');
140
+
141
+ //フィルタを再度設定する
142
+ sheet.getRange(1,1,lastrow,3).createFilter();
143
+
144
+ //不要の列削除(フィルタ用に挿入した列を削除)
145
+ sheet.deleteColumns(1, 1);
146
+
147
+ //A列の幅を広げる
148
+ sheet.setColumnWidth(1,160);
149
+
150
+ //フィルタで空白以外を表示
151
+ var criteria = SpreadsheetApp.newFilterCriteria()
152
+ .whenCellNotEmpty()
153
+ .build();
154
+ // 空白ではない値のみを表示
155
+ sheet.getFilter().setColumnFilterCriteria(2, criteria);
156
+
157
+ // 合計値を設定する
158
+ sheet.insertRows(1,1);
159
+ // sheet.getRange('A1').setValue('合計').setHorizontalAlignment('center');
160
+ sheet.getRange('A1').setValue('合計');
161
+
162
+ //B2のセル文字を中央に揃える
163
+ sheet.getRange('A:A').setHorizontalAlignment('center');
164
+
165
+
166
+ //B2のセルの金額以下の不要な文言を関数で取り除く
167
+ sheet.getRange('B1').activate();
168
+ sheet.getCurrentCell().setFormula('=sum(B3:B'+lastrow + ')');
169
+
170
+ //B2のセル文字が中央へ寄るので、右に揃える
171
+ sheet.getRange('B:B').setHorizontalAlignment('right');
172
+
173
+ //行を挿入した分ずれるので、フォルダ名を設定したセルをもとのD1:E1へもどす
174
+ sheet.getRange(3, 4,1,2).moveTo( sheet.getRange(1, 4) );
175
+
176
+ //------作成したGoogleドキュメントァイたち削除-----------------------
177
+
178
+ //★★フォルダ名(E1)を指定
179
+  var folderNamestr=sheet.getRange('E1').getValue();
180
+
181
+ //フォルダ名とファイルの種類を指定(ファイルの種類:Google Document)
182
+ var folder = DriveApp.getFoldersByName(folderNamestr).next();
183
+ var docs = folder.getFilesByType('application/vnd.google-apps.document');
184
+
185
+ //作成したGoogle Documentを削除する
186
+ while (docs.hasNext()) {
187
+ var file = docs.next();
188
+ var docId = file.getId();
189
+
190
+   file.setTrashed(true)
191
+
192
+   }
193
+
194
+ Browser.msgBox("請求金額の読込みが完了しました");
195
+
196
+ };
197
+
198
+ ```