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

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

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

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

Q&A

解決済

1回答

2796閲覧

【GAS】ある条件を満たしたら別シートに転記できるようにしたいです

aprico16

総合スコア1

Google スプレッドシート

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

0グッド

0クリップ

投稿2022/12/13 04:34

編集2022/12/13 04:39

始めまして。
GAS初心者の者です。

GoogleAppsScript にて、スプレッドシートのシートAのある条件を満たしたときに
シートBに転記されるというシステムを作成したいのですがerrorが出てしまうため
質問させていただきました。

作成したいシステムの詳細はこちらです。
①下記のAシートがある
Aシート:A列に商品名、B列に値段、C列に配送有無、D列に会計有無

②AシートのC列およびD列に文字列が入ったら
Bシートに商品名、値段、配送有無、会計有無を転記させる

下記のコードで実行してみると
dataSheet.getRange(i, 3).getValue() === ''で
「Exception: The starting row of the range is too small.」
とerrorが出てしまいます。

分かりずらかったら申し訳ございません。
どのように修正したらいいか教えていただけますと幸いです。
よろしくお願いいたします。

該当のソースコード

function partMatch(){

const spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
const dataSheet = spreadSheet.getSheetByName("Aシート");
const resultSheet = spreadSheet.getSheetByName("Bシート");
const START_COL_NUM = 1;
const START_ROW_NUM = 1;
const lastCol = dataSheet.getLastColumn();
const lastRow = dataSheet.getLastRow();

const nameArray =dataSheet.getRange(START_ROW_NUM, START_COL_NUM, lastRow, lastCol).getValues();
const nameArrayLen = nameArray.length;
const matchArray = [];

for(var i=0; i<nameArrayLen; i++){

if(dataSheet.getRange(i, 3).getValue() === '' && dataSheet.getRange(i, 4).getValue() === ''){ matchArray.push(nameArray[i]); } }

const matchArrayLen = matchArray.length;
resultSheet.getRange(START_ROW_NUM, START_COL_NUM, matchArrayLen, lastCol).setValues(matchArray);

}

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

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

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

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

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

guest

回答1

0

ベストアンサー

Exception: The starting row of the range is too small.

「開始の行(の数字が)小さすぎます」というエラーですね。

.getRange()における行や列の指定の数値は1から始まります。
普段慣れ親しんだ0ではありませんのでご注意。
よってiを1から開始してください。

diff

1- for(var i=0; i<nameArrayLen; i++){ 2+ for(var i=1; i<=nameArrayLen; i++){

そうすると下記部分がずれてくるので、i-1すればいけるかな?

diff

1- matchArray.push(nameArray[i]) 2+ matchArray.push(nameArray[i-1])

(コメント欄より)

現状、全ての行が転記されてしまいまして、
C列配送有無、D列会計有無に文字列が入っている行のみを
転記するには他にどのようにしたらいいかご教示いただいてもよろしいでしょうか。

まず確認ですが、partMatch()関数をトリガー設定しており、onEdit(編集したら実行される)に設定しているという認識でよろしいでしょうか?
それを前提としたコードです↓

javascript

1function partMatch(e) { // 引数にe 2 const activeSheetName = e.source.getSheetName(); // 編集されたシート名を取得 3 const targetSheetName = 'Aシート'; 4 const activeCol = e.range. getColumn(); // 編集された列番号を取得 5 6 // 編集されたのがAシートではない または CまたはD列ではない場合、ここで処理を終了する。以降の行は実行されない。 7 if ( activeSheetName !== targetSheetName || (activeCol !== 3 && activeCol !== 4) ) return; 8 9 // AシートのC or D列が編集された場合のみ実行される処理をこの行以降に書く。 10 const spreadSheet = SpreadsheetApp.getActiveSpreadsheet(); 11 const dataSheet = spreadSheet.getSheetByName("Aシート"); 12 const resultSheet = spreadSheet.getSheetByName("Bシート"); 13 14 // 以下省略 15 16}

こんな感じで行けると思います。

投稿2022/12/13 05:13

編集2022/12/13 07:55
Cocode

総合スコア2316

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

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

aprico16

2022/12/13 06:11

ご回答いただき有難うございます。 修正しましたところ、errorは解除できました。有難うございます。 現状、全ての行が転記されてしまいまして、 C列配送有無、D列会計有無に文字列が入っている行のみを 転記するには他にどのようにしたらいいかご教示いただいてもよろしいでしょうか。 おいそがしいところ恐れ入りますがよろしくお願いいたします。
Cocode

2022/12/13 07:55

回答を更新しました。ご確認ください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問