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

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

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

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

Gmail

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

Google Apps Script

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

Q&A

解決済

1回答

11039閲覧

GASエラー:Gmailからの転記でException: The starting row of the range is too small.が表示される

noasan

総合スコア2

Google スプレッドシート

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

Gmail

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

Google Apps Script

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

0グッド

1クリップ

投稿2021/12/16 05:21

編集2021/12/17 08:03

前提・実現したいこと

Gmailの未読メール本文を取り出し、スプレッドシートに自動転記したい。
スプレッドシート上でmyFunctionを実行中に下記の「Exception: The starting row of the range is too small.」エラーが発生しています。どの部分が誤りなのか判りません。

##発生しているエラー
Exception: The starting row of the range is too small.
(匿名) @ 試作.gs:29
(匿名) @ 試作.gs:11
myFunction @ 試作.gs:6

###該当のソースコード
function myFunction() {
// 検索条件に該当するスレッド一覧を取得
var threads = GmailApp.search('is:unread');

// スレッドを一つずつ取り出す
threads.forEach(function(thread) {
// スレッド内のメール一覧を取得
var messages = thread.getMessages();

// メールを一つずつ取り出す
messages.forEach(function(message) {

// メール本文を取得
var plainBody = message.getPlainBody();

// 番号を取り出す
var number = plainBody.match(/番号:(.*)/);

// メールアドレスを取り出す
var email = plainBody.match(/メールアドレス: (.*)/);

// 書き込むシートを取得
var sheet = SpreadsheetApp.getActive().getSheetByName('任意のシート名');

// 最終行を取得
var lastRow = sheet.getLastRow();

// セルを取得して値を転記
sheet.getRange(lastRow, 1).setValue(plainBody[1]);
sheet.getRange(lastRow, 2).setValue(number[1]);
sheet.getRange(lastRow, 3).setValue(email[1]);
});

// スレッドに転記ラベルを付ける
var label = GmailApp.getUserLabelByName('転記');
thread.addLabel(label);
});
}

####試したこと
別の質問で‘シート名’に誤りがあることを教えていただき修正後の実行です。シートは認識してくれているようなのですが、何に対してのエラーなのでしょうか。

#####自己解決方法(質問後にやってみたこと)

function myFunction() {
// 検索条件に該当するスレッド一覧を取得
var threads = GmailApp.search('is:unread');

// スレッドを一つずつ取り出す
threads.forEach(function(thread) {
// スレッド内のメール一覧を取得
var messages = thread.getMessages();

// メールを一つずつ取り出す messages.forEach(function(message) {

 // メール本文を取得
var plainBody = message.getPlainBody();

// 書き込むシートを取得
var sheet = SpreadsheetApp.getActive().getSheetByName('転記中');

// 最終行を取得
var lastRow = sheet.getLastRow() + 1;

// セルを取得して値を転記
sheet.getRange(lastRow, 1).setValue(plainBody[1]);
});

// スレッドに未対応ラベルを付ける var label = GmailApp.getUserLabelByName('未対応'); thread.addLabel(label);

});
}

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

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

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

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

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

guest

回答1

0

ベストアンサー

おそらく、出力対象のシートに1行もデータがなく、lastRow0 になり、sheet.getRange(lastRow, ...) で第1引数が範囲外(1以上の必要あり)になってエラーなのでしょう。

コードは「データがある最後の行に上書き」という動作になっていますが、シートにデータがまったくない場合の対処が必要です。

本当は「データがある最後の行のあとに追加」をしたいのかもしれません。その場合は var lastRow = sheet.getLastRow() + 1; とすればよいです。
また、sheet.appendRow([plainBody[1], number[1], email[1]]); とすれば getLastRow()getRange() も不要です。

appendRow()

投稿2021/12/16 05:35

編集2021/12/16 05:37
int32_t

総合スコア20860

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

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

noasan

2021/12/17 08:11

appendRow()についてご教示いただきありがとうございます。取り出したい項目を併記できるのですね。 一旦取り出し項目をメール本文のみにして、ご教示いただいた var lastRow = sheet.getLastRow() + 1; にて手動実行してみたところ、ラベルを貼るところまでエラーなく完了できました。ひとつ理解できたので項目を併記して実行できるかやってみたいと思います。 ただいま、スプレッドシートのどの行も、メール本文のどこかの1文字しか転記されないというトラブルに見舞われております…。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問