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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google スプレッドシート

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

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

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

Q&A

1回答

1337閲覧

【GAS】Gmailのラベルを条件として、随時内容をスプレッドシートへ積み上げたい:最終行の取得でエラーが出てしまう

Elly_

総合スコア11

Google スプレッドシート

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

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

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

0グッド

0クリップ

投稿2022/07/09 05:52

前提

Gmailで条件付きのラベルを設定し、そのラベルに振り分けられるメールを
GASを使ってスプレッドシートへ随時積み上げていくということをしようとしています。
(ラベルには送信元と〇〇という文字を含むという条件を設定済み)

https://tonari-it.com/gas-add-contact-mail/
上記サイトを参考に作成したところ以下エラーメッセージが発生しました。

実現したいこと

  • エラーを解消して特定条件のメールを受信する度、スプレッドシートへ転記・記録していきたい

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

TypeError: sheet.getRange(...).getarray is not a function searchContactMail @ コード.gs:19

該当のソースコード

function searchContactMail() { /* Gmailから特定条件のスレッドを検索しメールを取り出す */ const query = 'label:テスト'; const start = 0; const max = 10; const threads = GmailApp.search(query, start, max); const messagesForThreads = GmailApp.getMessagesForThreads(threads); const array = []; const spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); const sheet = spreadsheet.getSheetByName("ログ");//(シート名指定) //メッセージID列(F列の2行目~データのある最終行まで)を一次元配列として取得=Arrayオブジェクト.flat(深さ)// ** const lastRow = sheet.getLastRow();** **const ids = sheet.getRange(2, 6, lastRow).getarray().flat();** //メッセージIDを取得=Messageオブジェクト.getId()// for(const messages of messagesForThreads){ const message = messages[0]; const id = message.getId(); //配列の中にある値(ids内)に、現在のメッセージIDが含まれているかどうかを判定するif文// if(!ids.includes(id)){ const record = [ message.getDate(), message.getReplyTo(), message.getSubject(), message.getPlainBody().slice(0,200), message.getThread().getPermalink(), message.getId() ]; array.push(record); } } if(array.length > 0){ sheet.getRange(lastRow + 1, 1, array.length, array[0].length).setarray(array); } }

試したこと

取得するデータがないのが問題かと思い、一行目に項目名を追加してみましたが関係ないようでした。
(項目:date / from / subject / message / link / id)
イメージ説明

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

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

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

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

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

guest

回答1

0

そのサイトは特に見ていないのですが、getgarray/setarrayなんていう関数はありません。

getValues/setValuesを使用してください。

js

12 //メッセージID列(F列の2行目~データのある最終行まで)を一次元配列として取得=Arrayオブジェクト.flat(深さ)// 3 const lastRow = sheet.getLastRow(); 4 const ids = sheet.getRange(2, 6, lastRow).getValues().flat(); 5~略~ 6 if(array.length > 0){ 7 sheet.getRange(lastRow + 1, 1, array.length, array[0].length).getValues(array); 8 }

(動作確認はしていませんので他の部分に誤りがあったとしても関知しません)

投稿2022/07/09 06:06

編集2022/07/09 06:09
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Elly_

2022/07/13 02:47

ご回答いただきありがとうございます! 変数が自分の中でarrayの方がパッと見わかりやすかったため、 シート名取得の辺りのconst values = [];をconst array = [];としており、その流れでValuesもarrayにしてしまっていたようです。 (配列のarrayとvaluesの使い分け?もよく知らない素人で申し訳ありません) そちらと、そもそもの取得するラベル名が間違っていて動かなかったようでしたので、 修正したらスプレッドシートへ転記されるようにはなりました。 ありがとうございます。 あとは取得済みのメッセージを既読にする作業で躓いておりますが、 また模索してみたいと思います。 (queryにis:unreadを追加し、最終行にthreads.markRead();と入れたところ最終行でエラーが発生しております)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問