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

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

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

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

Google Apps Script

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

966閲覧

【GAS】getRange.setValues() エラーの解消方法

donguriko

総合スコア30

Google スプレッドシート

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

Google Apps Script

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2022/10/27 10:50

編集2022/10/27 11:14

前提

(10/27 20:14追記)
投稿しましたが、エラーは自己解決できました。
下記<2><3>部分のみアドバイスをいただけます
でしょうか?

次の2つのスプレッドシートファイルがあります。
①個票
②全体票

<①個票のイメージ>
イメージ説明

<②全体票>のイメージ
イメージ説明

実現したいこと

GASで①個票のB4:E9の内容を全体票に転記させたいです。
個票のデータはgetRange().getValues()で一度にまとめて
二次元配列として取得。

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

ログで見ると二次元配列でデータは取得できていそうです。
が、下のエラーがたってしまいました。
何か基本的なことを見落としている気がするのですが、
コードのどこがマズイのかが分かりません。

<1>解消するためのアドバイスをいただけないでしょうか?

<2>次のどちらがおすすめでしょうか?
setValuesで配列内の列単位で転記していくコードで
記載しましたが、報告1、(入力日、入力者、推移) 報告2、、
と行単位で転記していく方法も可能かと思います。
どちらのアプローチがよいのでしょうか?
その理由も教えて欲しいです。

<3>上記<2>で行単位で転記の場合のコード記載
let rep1 = fromRange[r]; 、、、等
行インデックスのみ指定する方法に変更する形でしょうか?
この場合、転記先ファイルへのデータ転記部分のコードのgetRangeの
(行,列,行分,列分)の4つ目の引数? は3に変更でしょうか?

Exception: The parameters ((class)) don't match the method signature for SpreadsheetApp.Range.setValues. myFunction @ 個票⇒全体票.gs:49

該当のソースコード

以下、コード全文記載します。

GAS

1(自己解決コード) ------------------------------------------------------------ 2function myFunction(indvToall) { 3 4 //ALLファイルURL 5 // https://docs.google.com/spreadsheets/d/1NbSg5b2aW3U1-RaOPHsh6ZUTFp5WAxeKQ1WpL3oF5sQ/edit#gid=0 6 7 //ALLファイルID 8 //1NbSg5b2aW3U1-RaOPHsh6ZUTFp5WAxeKQ1WpL3oF5sQ 9 10 const fromss = SpreadsheetApp.getActiveSpreadsheet(); 11 const toss = SpreadsheetApp.openById("1NbSg5b2aW3U1-RaOPHsh6ZUTFp5WAxeKQ1WpL3oF5sQ"); 12 const fromSheet = fromss.getSheetByName('入力シート'); 13 const toSheet = toss.getSheetByName('全体進捗'); 14 15 //▼個票ファイルのファイルID(スプレッドシートID)の取得 16 fromId = fromss.getId(); 17 fromURL = fromss.getUrl(); 18 console.log('fromId ' + fromId); 19 console.log('fromURL ' + fromURL); 20 21 //▼転記先ファイル(ALL)の転記行(targetRow)の取得 22 //個票のセルF10から取得 23 const targetRow = fromSheet.getRange(10, 6, 1, 1).getValue(); // 6が正解 24 console.log('targetRow ' + targetRow); 25 26 //▼転記先ファイル(ALL) B列に転記元ファイル(個票)URLを転記 27 fromUrl = toSheet.getRange(targetRow, 2, 1, 1).setValue(fromURL); 28 console.log('fromUrl ' + fromUrl); 29 30 //▼転記先ファイル(ALL) U列に転記元ファイル(個票)IDを転記 31 fromUrl = toSheet.getRange(targetRow, 21, 1, 1).setValue(fromId); 32 console.log('fromId ' + fromId); 33 34 fromRange = fromSheet.getRange(4, 2, 6, 3).getValues(); 35 console.log('fromRange ' + fromRange); 36 37 //▼個票ファィルのデータ取得 38 //B4~D9までを二次元配列(fromRange)で取得 39 //二次元配列(fromRange) 40 for (let r = 0; r <= 5; r++) { 41 let date = fromRange[r][0];   //入力日 42 let name = fromRange[r][1];   //入力者 43 let cond = fromRange[r][2];   //概要 44 console.log('date ' + date); 45 console.log('name ' + name); 46 console.log('cond ' + cond); 47 48 //▼転記先ファイル(ALL)へのデータ転記 49 //状況報告1欄への転記 50 //getRange(行,列,行分,列分) 51 const setdate = toSheet.getRange(targetRow, 3 + r *3, 1, 1).setValue(date); 52 const setname = toSheet.getRange(targetRow, 4 + r *3, 1, 1).setValue(name); 53 const setcond = toSheet.getRange(targetRow, 5 + r *3, 1, 1).setValue(cond); 54 55 //▼個票ファィルの「自動処理日時」欄(E列)にタイムスタンプを追記 56 const timeStamp = new Date(); 57 console.log(timeStamp); 58 fromSheet.getRange(4 + r, 5, 1, 1).setValue(timeStamp); 59 60 } 61} 62 63(誤コード) -------------------------------------------------------------------- 64function myFunction(indvToall) { 65 66 //ALLファイルURL 67 // https://docs.google.com/spreadsheets/d/1NbSg5b2aW3U1-RaOPHsh6ZUTFp5WAxeKQ1WpL3oF5sQ/edit#gid=0 68 69 //ALLファイルID 70 //1NbSg5b2aW3U1-RaOPHsh6ZUTFp5WAxeKQ1WpL3oF5sQ 71 72 const fromss = SpreadsheetApp.getActiveSpreadsheet(); 73 const toss = SpreadsheetApp.openById("1NbSg5b2aW3U1-RaOPHsh6ZUTFp5WAxeKQ1WpL3oF5sQ"); 74 const fromSheet = fromss.getSheetByName('入力シート'); 75 const toSheet = toss.getSheetByName('全体進捗'); 76 77 //▼個票ファイルのファイルID(スプレッドシートID)の取得 78 fromId = fromss.getId(); 79 fromURL = fromss.getUrl(); 80 console.log('fromId ' + fromId); 81 console.log('fromURL ' + fromURL); 82 83 //▼転記先ファイル(ALL)の転記行(targetRow)の取得 84 //個票のセルF10から取得 85 const targetRow = fromSheet.getRange(10, 6, 1, 1).getValue(); // 6が正解 86 console.log('targetRow ' + targetRow); 87 88 //▼転記先ファイル(ALL) B列に転記元ファイル(個票)URLを転記 89 fromUrl = toSheet.getRange(targetRow, 2, 1, 1).setValue(fromURL); 90 console.log('fromUrl ' + fromUrl); 91 92 //▼転記先ファイル(ALL) U列に転記元ファイル(個票)IDを転記 93 fromUrl = toSheet.getRange(targetRow, 21, 1, 1).setValue(fromId); 94 console.log('fromId ' + fromId); 95 96 //▼個票ファィルのデータ取得 97 //B4~D9までを二次元配列(fromRange)で取得 98 //二次元配列(fromRange) 99 for (let r = 0; r <= 6; r++) { 100 fromRange = fromSheet.getRange(4, 2, 6, 3).getValues(); 101 console.log('fromRange ' + fromRange); 102 let date = fromRange[r][0];   //入力日 103 let name = fromRange[r][1];   //入力者 104 let cond = fromRange[r][2];   //概要 105 console.log('date ' + date); 106 console.log('name ' + name); 107 console.log('cond ' + cond); 108 109 //▼転記先ファイル(ALL)へのデータ転記 110 //状況報告1欄への転記 111 //getRange(行,列,行分,列分) 112 const setdate = toSheet.getRange(targetRow, 3 + r *3, 1, 1).setValues(date); 113 const setname = toSheet.getRange(targetRow, 4 + r *3, 1, 1).setValues(name); 114 const setcond = toSheet.getRange(targetRow, 5 + r *3, 1, 1).setValues(cond); 115 116 //▼個票ファィルの「自動処理日時」欄(E列)にタイムスタンプを追記 117 const timeStamp = new Date(); 118 console.log(timeStamp); 119 fromSheet.getRange(4 + r, 5, 1, 1).setValue(timeStamp); 120 121 } 122} 123 124

試したこと

(参考) ログイメージ
イメージ説明

補足情報(FW/ツールのバージョンなど)

お忙しいところ申し訳ありませんが、
非エンジニアビギナーでも理解できるレベルのアドバイス、解説を
いただけると助かります。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

<2>

「setValuesで配列内の列単位で転記していくコードで記載しましたが、報告1、(入力日、入力者、推移) 報告2、、と行単位で転記していく方法も可能かと思います。」
どちらのアプローチがよいのでしょうか?
その理由も教えて欲しいです。

 
仮に、後半の「報告1、(入力日、入力者、推移) 報告2、、と行単位で転記していく方法」というのが
「(入力日、入力者、推移)の3つをまとめて setValues を使って転記する方法」ということであるならば、そちらを推奨します。

  • 理由

現状は、入力日、入力者、推移 それぞれを転記する際に1つ1つ setValue() を呼び出しているため、「個票」シートの6行のデータを書き込むのに setValue を18回呼び出しています。
仮に setValues で入力日、入力者、推移 をまとめて書き込めば、「個票」シートの6行のデータを書き込むのに setValues を 6 回呼び出すだけで済みます。
結果、処理の高速化が期待できます。(現状は個票1ページの転記だけなのでほとんど差は感じられないと思いますが)

<3>上記<2>で行単位で転記の場合のコード
下記のように、 setValues で date、name、cond を配列にしてまとめて書き込みます。
具体的には、コード終盤の下の3行を

js

1 const setdate = toSheet.getRange(targetRow, 3 + r *3, 1, 1).setValues(date); 2 const setname = toSheet.getRange(targetRow, 4 + r *3, 1, 1).setValues(name); 3 const setcond = toSheet.getRange(targetRow, 5 + r *3, 1, 1).setValues(cond);


以下の1行に書き換えます。

js

1 const setdate = toSheet.getRange(targetRow, 3 + r *3, 1, 3).setValues([[date, name, cond]]); 2 // const setname = toSheet.getRange(targetRow, 4 + r *3, 1, 1).setValues(name); // この行は削除 3 // const setcond = toSheet.getRange(targetRow, 5 + r *3, 1, 1).setValues(cond); // この行も削除

投稿2022/10/30 03:51

編集2022/10/30 08:27
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

donguriko

2022/10/31 10:21

qnoirさま お忙しい中、レクチャーありがとうございます。 どう記載すれば(入力日、入力者、推移)の3つを1setで配列から呼び足せるかが 分からなかったのですが、setValues([[date, name, cond]])と記載すれば 良かったのですね。しっかり覚えて自分のモノにしたいと思います。 配列は、 getValues()でデータを取得する際は、できるだけ大きな範囲で値を取得し、 setValues()取得したデータを呼び出す時には、できるだけ呼び出し回数が 少なくなるように呼び出すべし、ですね。 勉強になりました。ありがとうございました。(感謝) 以前よりは配列について、少し分かるようになってきたものの まだまだですね。。。 引き続き勉強していきたいと思います。 お忙しい中、いつも丁寧な解説 本当にありがとうございます!! (感謝)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問