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

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

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Google

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

Q&A

解決済

1回答

1391閲覧

GAS最後の行で行数が違うといわれるけどなんで。

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Google

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

0グッド

0クリップ

投稿2020/01/02 08:25

以下のスクリプトで行数が最後の1列で違うといわれます。範囲大きさ同じはずなのですが。
よくわかりません。

GAS

1function copypast() { 2 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 3 var report = spreadsheet.getSheetByName('【レポート'); 4 var origin = spreadsheet.getSheetByName('元'); 5 var origin_last_row = origin.getLastRow(); //行 6 var account_name = report.getRange(1, 2).getValue(); 7 var account_column = origin.getRange(2, 1, origin_last_row-1).getValues(); 8 var data = [] 9 10 for(var i = 0; i < account_column.length; i++) { 11 if(account_column[i][0] === account_name) { 12 var data_row = origin.getRange(i+2, 2, 1, 10).getValues(); 13 data.push(data_row[0]); 14 } 15 } 16 17 var campagins = report.getRange(5+i, 3, 1, 10).getValues(); 18 var data_campagins = []; 19 for(var i = 0; i < campagins.length; i++) { 20 var range = report.getRange(5+i, 3, 1, 10).setValues(data); 21} 22}

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

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

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

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

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

CHERRY

2020/01/02 08:46

エラーが出ているのであれば、エラーメッセージをそのまま(個人情報等を含む部分は適宜置き換えて)記載していただけないでしょうか?
退会済みユーザー

退会済みユーザー

2020/01/02 09:00

失礼しました。 以下のように言われます。 ``` データの行数が範囲の行数と一致しません。データは 22 行ですが、範囲は 1.行です。 ```
draq

2020/01/02 09:35

スプレッドシートのデータがどうなっているかわかりませんが、単に data.length が 10 でないだけではないでしょうか。 setValue する前に data.length を確認してみてください。
m.ts10806

2020/01/02 13:19

「はず」と言われてもプログラムは書いた通りにしか動かないので 「同じである」根拠を確認して提示してください。
guest

回答1

0

ベストアンサー

いろいろと言えることがあるので書いておきます。

まず、動きについて確認ですが、varを除いて実際の動いている文は下記になりますね。

GAS

1 2 for(var i = 0; i < account_column.length; i++) { 3 if(account_column[i][0] === account_name) { 4 var data_row = origin.getRange(i+2, 2, 1, 10).getValues(); 5 data.push(data_row[0]); 6 } 7 } 8 9 for(var i = 0; i < campagins.length; i++) { 10 var range = report.getRange(5+i, 3, 1, 10).setValues(data); 11} 12} 13

これは見る限り、最初は一行づつdataへ対象をプッシュしていき、それが終わった後で
また一行ずつsetValuesを使用する流れに見えます。
(var range = report.getRange(5+i, 3, 1, 10).setValues(data);)
でしっかり貼り付けられるのか不明ですが・・・・

エラー文に関して

データの行数が範囲の行数と一致しません。データは 22 行ですが、範囲は 1.行です。

との事ですが、
最初の文でdata.pushを行っているわけですから、 data内には複数の二次配列データがあるはずです。

それを前提として考えると、
report.getRange(5+i, 3, 1, 10)
これはI=0、A1表記でいうと、"C5:L5"です。

何が言いたいかというと、1行しか範囲を指定していないのに、貼り付けしたいdataは22行ということで、エラーが発生します。

対処法に関して

いろいろ対処法はありますが、一番手っ取り早いのは

GAS

1 2 for(var i = 0; i < account_column.length; i++) { 3 if(account_column[i][0] === account_name) { 4 var data_row = origin.getRange(i+2, 2, 1, 10).getValues(); 5 data.push(data_row[0]); 6 } 7 } 8 report.getRange(5,3,data.length,data[0].length).setValues(data); 9 10} 11

とりあえず以上ですが、なんかいろいろ書き方に問題がありそうです。
具体的な問題はわからないので自分の中で違和感があった部分を書きますと。

var campagins = report.getRange(5+i, 3, 1, 10).getValues();

この分はfor外にあります。
前の文のfor文が終わった後のデータを取得したい場合にやっているのであればいい(本当に良いのか不明)ですが、自分の中ではfor文外に 「+i」 を入れているところに違和感を感じたりします。


for(var i = 0; i < campagins.length; i++) {
var range = report.getRange(5+i, 3, 1, 10).setValues(data);
}

var は変数ですが、 .setValuesは実行する部分なので、var~~~~.setValuesに違和感を感じます。

投稿2020/01/03 13:03

編集2020/01/03 13:21
takaD

総合スコア315

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問