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

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

新規登録して質問してみよう
ただいま回答率
85.44%
LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google ドキュメント

Google ドキュメントは、Google社が提供している文書作成ツール。Googleアカウントがあれば無料で利用できます。ブラウザ上で文書作成を行い、複数人での同時編集がで可能。スマホやタブレットでも利用できる他、オフラインでの編集もできます。

Google Apps Script

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

Q&A

解決済

1回答

759閲覧

GASでスプレッドシートの最終行にGoogleドキュメントのテキストを転記したいが上書きされてしまう

cardamon

総合スコア19

LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google ドキュメント

Google ドキュメントは、Google社が提供している文書作成ツール。Googleアカウントがあれば無料で利用できます。ブラウザ上で文書作成を行い、複数人での同時編集がで可能。スマホやタブレットでも利用できる他、オフラインでの編集もできます。

Google Apps Script

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

0グッド

0クリップ

投稿2023/03/05 14:45

編集2023/03/05 23:32

実現したいこと

手持ちの本をOCRで読み込み、スプレッドシートに転記したいと考えています。
(索引がついていない図鑑本の全文検索がしたい)

前提

作りたいのは以下です。

LINEに写メが送られたら

Googole Driveに画像を保存

Drirveに新たな画像が保存されたらGoogleドキュメントで画像を開く(OCR化)

Googleドキュメントのテキストをスプレッドシートに転記(1画像1セル)

Google Driveの画像とドキュメントファイルは削除

LINEで書込完了と返事

発生している問題・エラーメッセージ

A1、A2と、最終行に1ページごとのテキストを追加していきたいのですが、A1に上書きされてしまいます。

該当のソースコード

GoogleAppsScript

1const ACCESS_TOKEN = '●●●'; // LINEアクセストークン 2const LINE_ENDPOINT = "https://api.line.me/v2/bot/message/reply"; 3const LINE_DATA_ENDPOINT = "https://api-data.line.me/v2/bot/message/"; 4const SHEET_ID = "●●●"; // スプレッドシートのID 5const FOLDER_ID = "●●●"; // Google DriveのフォルダID 6 7function doPost(e) { 8 // LINEからPOSTされるJSON形式のデータをGAS形式(JSオブジェクト)に変換 9 var json = JSON.parse(e.postData.contents); 10 11 // LINEから送信された画像を取得 12 var img_url = LINE_DATA_ENDPOINT + json.events[0].message.id + "/content"; 13 var img_options = { "headers" : { 'Authorization': 'Bearer ' + ACCESS_TOKEN } }; 14 const blob = UrlFetchApp.fetch(img_url, img_options).getBlob(); 15 16 // Google Driveに画像をアップ>OCRを同時実行>Googleドキュメントに保存 17 var driveOptions = { 18 "title": "test.jpg", 19 "parents": [{id: FOLDER_ID}] 20 }; 21 const image = Drive.Files.insert(driveOptions, blob, { "ocr": true, "ocrLanguage": "ja" }); 22 var ocrText = DocumentApp.openById(image.id).getBody().getText(); // ドキュメント内のテキスト取得 23 24 // スプレッドシートに読み取った内容を書込 25var sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName("●●●"); 26var lastRow = sheet.getLastRow() + 1; 27sheet.getRange(lastRow, 1).setValue(ocrText); 28 29 // 読取後、指定フォルダ内のファイルすべて削除 30 var folder = DriveApp.getFolderById(FOLDER_ID); 31 var files = folder.getFiles(); 32 while(files.hasNext()){ 33 var file = files.next(); 34 file.setTrashed(true);  35 } 36 // 応答用のメッセージを作成 37 var message = { 38 "replyToken" : json.events[0].replyToken, 39 "messages" : [{"type": "text", 40 "text" : "書込完了"}]     //  応答メッセージの内容 41 }; 42 // LINE側へデータを返す際に必要となる情報 43 var options = { 44 "method" : "post", 45 "headers" : { 46 "Content-Type" : "application/json; charset=UTF-8", // JSON形式を指定、LINEの文字コードはUTF-8 47 "Authorization" : "Bearer " + ACCESS_TOKEN 48 }, 49 "payload" : JSON.stringify(message)            // 応答文のメッセージをJSON形式に変換する 50 }; 51 // LINEへ応答メッセージを返す 52 UrlFetchApp.fetch(LINE_ENDPOINT, options); 53}

試したこと

上記コードのほか、appendRowも試しましたが、上書きされました。

GoogleAppsScript

1var sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName("●●●"); 2sheet.appendRow(ocrText);

とても初歩的な記述ミスのような気がするのですが、自分では見つけられませんでした。もしおわかりになる方がいたら、ヒントいただけますと幸いです。

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

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

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

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

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

guest

回答1

0

自己解決

初歩的ですが、最終行取得後、シートを指定し、デプロイし直すと無事に動きました。

修正前

GoogleAppsScript

1var sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName("●●●"); 2var lastRow = sheet.getLastRow() + 1; 3sheet.getRange(lastRow, 1).setValue(ocrText);

修正後

GoogleAppsScript

1var sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName("●●●"); 2var lastRow = sheet.getLastRow(); 3SpreadsheetApp.openById(SHEET_ID).getSheetByName("●●●").getRange(lastRow + 1, 1).setValue(ocrText);

(直接関係ありませんが、最終行プラス1を取得していた点も、最終行を取得するよう変更)

投稿2023/03/05 23:38

cardamon

総合スコア19

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問