質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

2回答

1379閲覧

Googleドキュメント内の文字検索と値取得

tottey1226

総合スコア19

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

1クリップ

投稿2021/08/17 09:54

前提・実現したいこと

 実現したいこと
① GASで、特定のフォルダに保存されている複数のPDFを全てGoogleドキュメントに変換
② ①で変換した複数のGoogleドキュメント(ファイルによって、内容が異なる)から、
'調整後請求額(税抜)'と言う文字を検索し、その文字のすぐ右隣に記載されている金額を取得
③ ②で取得した値(金額)をスプレットシートに貼り付けてリスト化

 上記を実現したく、以下のように記載しました。

①の「特定のフォルダに保存されている複数のPDFを全てGoogleドキュメントに変換」は実現できたのですが、②以降が実現できません。
以下を実行すると、複数のGoogleドキュメントから文字として認識した1行目だけ取得してスプレットシートに書き込みはできましたが、検索して、その隣の値を取得する方法がわかりませんでした。
どなたかどのように検索して値(金額)を取得すればいいのかご指導いただけないでしょうか。

function ocrSample() {
var folder = DriveApp.getFoldersByName('Amazon_ono').next();
var images = folder.getFilesByType('application/pdf'); //PDFを指定
while (images.hasNext()) {
var image = images.next();
var docName = image.getName().split(".")[0];
var Request_body = {
title: docName,
mimeType: 'application/pdf' //PDFを指定
}
Drive.Files.insert(Request_body, image, { ocr: true });

// Drive.Files.insert(Request_body,application,{ocr:true}); var newFile = DriveApp.getFilesByName(docName).next(); folder.addFile(newFile); DriveApp.getRootFolder().removeFile(newFile);

}

 //1行目だけ取得するコード(ここで複数のGoogleドキュメントから1行目としての文字は取得できます)
var docs = folder.getFilesByType('application/vnd.google-apps.document');
var texts = [];
while (docs.hasNext()) {
var file = docs.next();
var docId = file.getId();
var doc = DocumentApp.openById(docId);
var text = doc.getBody().getText().split('\n')[1];
texts.push([text]);
}
var sheet = SpreadsheetApp.getActiveSheet();
sheet.getRange(1, 1, texts.length, 1).setValues(texts);
}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

下記のコードで、金額までの文字を消すことができるかと思います。

GAS

1var text = doc.getBody().getText().replace(/^[\s\S]*調整後請求額\(税抜\)/,"") 2texts.push([text]);

もし金額が???円で書かれているなら、以下のコードで金額が取得できるかもしれません。

GAS

1var text = doc.getBody().getText().replace(/^[\s\S]*調整後請求額\(税抜\)/,"").replace(/円[\s\S]*/,"").trim(); 2texts.push([text]);

投稿2021/08/19 14:41

fake_shibe

総合スコア806

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tottey1226

2021/08/21 01:43

ありがとうございます!目から鱗です。抜き出すのではなく、置換で消すという発想が私にはありませんでした。 ご教示いただいた通り、 var text = doc.getBody().getText().replace(/^[\s\S]*調整後請求額\(税抜\)/,"") texts.push([text]);  と書き換えて実行してみたところ、先頭に「調整後請求額(税抜)」の右隣の数値が表示され、以降の文字列が表示されました。以降の文字列の削除をどう削除するか、調べてやってみます。 助かりました。
guest

0

//複数の請求書(PDFファイル)に記載してある請求金額を取得し、リスト化するスクリプトを作成してみました。実行時間は3~5分かかります。

//実現できたこと
//① GASで、特定のフォルダに保存されている複数のPDFを全てGoogleドキュメントに変換
//② ①で変換した複数のGoogleドキュメント(ファイルによって、内容が異なる)から、'調整後請求額(税抜)'と言う文字を検索し、その文字のすぐ右隣に記載されている金額を取得
//③ ②で取得した値(金額)をスプレットシートに貼り付けてリスト化
//④ ①で変換したGoogleドキュメントファイルを削除

//----注意1 PDFが入っているフォルダと同じ階層にこの実行ファイルを置いておく
//----注意2 PDFが入っているフォルダ内には、余計なファイルは入れない

//PDF請求書の調整後請求額(税抜)の金額のみを取得してリスト表示するスクリプト

function ocrSample() { var spreadsheet = SpreadsheetApp.getActive(); var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = SpreadsheetApp.getActiveSheet(); //★★フォルダ名がE1のセルに設定されているか判定  var folderNamestr=sheet.getRange('E1').getValue(); // var folder = DriveApp.getFoldersByName('PDF請求書が入っているフォルダ名') // var sheet = SpreadsheetApp.getActiveSheet(); //E1のセルにフォルダ名が設定されていなかったら処理を中止して、設定するようメッセージを表示 if (folderNamestr=="") { Browser.msgBox("【E1】のセルにPDF請求書が入っているフォルダ名を\n 設定してください"); sheet.getRange('E1').activate(); /* 終了処理 */ return; } //フォルダ名とファイルの種類を指定 var folder = DriveApp.getFoldersByName(folderNamestr).next(); var images = folder.getFilesByType('application/pdf'); //PDFを指定 //上で指定したfolder内のPDFをドキュメントにして保存 while (images.hasNext()) { var image = images.next(); var docName = image.getName().split(".")[0]; var Request_body = { title: docName, mimeType: 'application/pdf' //PDFを指定 } //PDFのファイル内容をGoogleドキュメントにocr機能を使って落とし込む Drive.Files.insert(Request_body, image, { ocr: true }); // Drive.Files.insert(Request_body,application,{ocr:true}); //PDFのファイル内容をGoogleドキュメント形式で同じフォルダへ保存 var newFile = DriveApp.getFilesByName(docName).next(); folder.addFile(newFile); DriveApp.getRootFolder().removeFile(newFile); } var docs = folder.getFilesByType('application/vnd.google-apps.document'); var texts = []; while (docs.hasNext()) { var file = docs.next(); var docId = file.getId(); var doc = DocumentApp.openById(docId); // var text = doc.getBody().getText().split('\n')[1]; // texts.push([text]); var fname = doc.getName(); var fnamestr = doc.getBody().getText().split('\n')[1]; texts.push([fname]); //Googleドキュメントの税抜の調整後請求額より前の文章を削除 var text = doc.getBody().getText().replace(/^[\s\S]*調整後請求額\(税抜\)/,""); texts.push([text]); } //ここからスプレットシートでの処理 //フィルタがかかっていたらいったん解除する //フィルタがかかっている状態では次に実行するすべてのデータクリアがされないため。 var filter = sheet.getFilter(); if( filter == null ){ } else { sheet.getFilter().remove(); //フィルタをオフにする } //スプレットシートのA列とB列のデータを初期化する(前回の使用されたものが残っているとおかしくなるので) // sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).activate(); sheet.getRange(1, 1, sheet.getMaxRows(), 2).activate(); sheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true}); sheet.getRange('D1').setValue('請求書が入ったフォルダ名⇒'); //Googleドキュメントファイルのデータをスプレットシートへ書き込む sheet.getRange(1,1, texts.length, 1).setValues(texts); //このあと、スプレットシートでデータを作成するためのCopyPasteを実行する CopyPaste(); //以下、CopyPasteの内容---------- function CopyPaste() { // var spreadsheet = SpreadsheetApp.getActive(); var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = SpreadsheetApp.getActiveSheet(); var lastrow = sheet.getLastRow(); console.log('lastrow:' + lastrow ); // //スプレットシートの全てのデータを初期化する // sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).activate(); // sheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true}); //B2のセルの金額以下の不要な文言を関数で取り除く sheet.getRange('B2').activate(); sheet.getCurrentCell().setFormula('=IFERROR(VALUE(SUBSTITUTE(left(A2,FIND("消費税", A2)-1), CHAR(10), "")),"")'); //B2のセルの関数を最終行まで設定する sheet.getRange('B2:B'+lastrow).activate(); sheet.getRange('B2').copyTo(sheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false); //フィルターがかからないため、A列の値のあるセルに文字を挿入 sheet.getRange('A:A').activate(); sheet.insertColumnsBefore(sheet.getActiveRange().getColumn(), 1); sheet.getRange('A1:A'+lastrow).setValue('1'); //B列に設定した関数(A列挿入に伴いC列に移動となった)を文字へ置き換える sheet.getRange('C2:C'+lastrow).copyTo(sheet.getRange('C1'), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false); //C列の金額を3桁区切り表記にする sheet.getRange('C1:C'+lastrow).setNumberFormat('#,##0'); sheet.deleteRow(lastrow); //行を一番上に追加し、ファイル名と、金額の項目を追記する sheet.insertRows(1,1); sheet.getRange('B1').setValue('ファイル名').setHorizontalAlignment('center'); sheet.getRange('C1').setValue('調整後請求額(税抜)').setHorizontalAlignment('center'); //フィルタを再度設定する sheet.getRange(1,1,lastrow,3).createFilter(); //不要の列削除(フィルタ用に挿入した列を削除) sheet.deleteColumns(1, 1); //A列の幅を広げる sheet.setColumnWidth(1,160); //フィルタで空白以外を表示 var criteria = SpreadsheetApp.newFilterCriteria() .whenCellNotEmpty() .build(); // 空白ではない値のみを表示 sheet.getFilter().setColumnFilterCriteria(2, criteria); // 合計値を設定する sheet.insertRows(1,1); // sheet.getRange('A1').setValue('合計').setHorizontalAlignment('center'); sheet.getRange('A1').setValue('合計'); //B2のセル文字を中央に揃える sheet.getRange('A:A').setHorizontalAlignment('center'); //B2のセルの金額以下の不要な文言を関数で取り除く sheet.getRange('B1').activate(); sheet.getCurrentCell().setFormula('=sum(B3:B'+lastrow + ')'); //B2のセル文字が中央へ寄るので、右に揃える sheet.getRange('B:B').setHorizontalAlignment('right'); //行を挿入した分ずれるので、フォルダ名を設定したセルをもとのD1:E1へもどす sheet.getRange(3, 4,1,2).moveTo( sheet.getRange(1, 4) ); //------作成したGoogleドキュメントファイルたちを削除----------------------- //★★フォルダ名(E1)を指定  var folderNamestr=sheet.getRange('E1').getValue(); //フォルダ名とファイルの種類を指定(ファイルの種類:Google Document) var folder = DriveApp.getFoldersByName(folderNamestr).next(); var docs = folder.getFilesByType('application/vnd.google-apps.document'); //作成したGoogle Documentを削除する while (docs.hasNext()) { var file = docs.next(); var docId = file.getId();   file.setTrashed(true)   } Browser.msgBox("請求金額の読込みが完了しました"); };

投稿2021/09/27 05:27

編集2022/02/17 00:35
tottey1226

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問