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

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

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

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

Google Apps Script

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

Q&A

解決済

1回答

1389閲覧

gas スプレッドシート getRange array.lengthについて

Igloo

総合スコア15

Google スプレッドシート

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

Google Apps Script

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

0グッド

0クリップ

投稿2022/01/28 23:58

エラーが出てしまって困っています。ご教授お願いします。

内容です。
sheet.getRange(lastRow,1,array2d.length,array2d[0].length).setValues(array2d);
を上手く表現できなくてエラーが出てしまいます。

エラーメッセージは
Exception: The number of columns in the data does not match the number of columns in the range. The data has 1 but the range has 2.
とレンジの大きさのエラーが出てしまいます。データの大きさで最終行、列を指定しているつもりなのですが...
素人すぎる質問ですみません。

以下GAS内容

function myFunction() {
// 検索条件に該当するスレッド一覧を取得
var threads = GmailApp.search('subject:あああああ -label:処理済み');

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

// メールを一つずつ取り出す messages.forEach(function(message) { // メール本文を取得 var plainBody = message.getPlainBody(); let array2d = plainBody.split('\n').map(line => line.split(',')); // 書き込むシートを取得 var sheet = SpreadsheetApp.getActive().getSheetByName('受信ナンバー'); // 最終行を取得 var lastRow = sheet.getLastRow() +1; // セルを取得して値を転記 sheet.getRange(lastRow,1,array2d.length,array2d[0].length).setValues(array2d); }); // スレッドに処理済みラベルを付ける //var label = GmailApp.getUserLabelByName('処理済み'); //thread.addLabel(label);

});
}

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

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

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

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

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

guest

回答1

0

ベストアンサー

「The data has 1 but the range has 2.」とはすなわち、range(=getRangeで指定した書き込み先範囲)は2列なのに、
data(=実際に書き込もうとしている値)は1列、という意味です。

setValuesに2次元配列を指定する場合、すべての行について同じ要素数でないといけません。

メール本文を加工した結果の「array2d」について
一部の行が他の行と異なる要素数になっている可能性があります。
console.log(array2d)
として、array2dの中身がどうなっているか確認してください。

たとえば、メール本文が

1,2 3,4 5,6

となっていて、最後の行に改行がある場合、
array2dは
[['1', '2'], ['3', '4'],['5', '6'], ['']]
となり、最後の行だけ要素が1つしかないため、エラーになります。

この場合最後の行['']を削除するか、
最後の行にダミーの要素を1つ追加して
['', ''] 等とする必要があります。

(いずれにしても、どう直すかは、array2dの具体的な中身によります)


コメントより:
配列の最後の要素を削除する場合は

array2d.pop();

とします。

投稿2022/01/29 00:55

編集2022/01/29 07:00
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Igloo

2022/01/29 06:55

qnoirさんありがとうございます。 console.log(array2d)の中身でございます。 [ [ '"20220127_210456"', '"4549741015462"\r' ], [ '"20220128_210500"', '"4987192002448"\r' ], [ '"20220128_101319"', '"4987192002448"\r' ], [ '"20220128_210456"', '"4549741015462"\r' ], [ '"20220130_210500"', '"4987192002448"\r' ], [ '"20220131_101319"', '"4987192002448"\r' ], [ '' ] ] MAILでの最後はエンターの改行が無いのですが、データで確認するとご指摘の通り最後が要素数が違っておりました。私としては[""]がGASのなかで消せればと思っておりますが、ご教授いただけるとありがたいです。
退会済みユーザー

退会済みユーザー

2022/01/29 07:00

追記しました
Igloo

2022/01/29 10:54

qnoirさん ありがとうございます。魔法のように一瞬で悩んでいたことが解決しました。 ほんとすごい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問