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

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

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

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

Google Apps Script

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

Q&A

解決済

2回答

847閲覧

GAS for文の繰り返し処理について

NANa

総合スコア1

Google スプレッドシート

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

Google Apps Script

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

0グッド

0クリップ

投稿2023/09/23 11:01

実現したいこと

  • GASで、C列に特定の文字が入っていた場合のみ、A列にある値を別のスプレッドシートの最終行の1行下から順番に貼り付けたい。

前提

スプレッドシートで台帳管理をしております。
A列...ID
B列...名前
C列...条件(3種類の回答のうち1つ)
CSVでシステムに取り込むのにあたり、C列の条件に該当する人のみを別シートにIDを貼り付けたいと思っております。

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

for文とif文(indexOf)を使い、必要なIDを抽出するところまではできました。
しかし、最終行の1行下(1行目が項目名だった場合2行目)に繰り返し貼り付けられてしまい、3人該当者がいた場合に最後の1人しか表示されないことになっています。
理想は、3人いた場合は1行目項目名、2行目1人目、3行目2人目、…と下の行に続いて貼り付けを行ってほしいです。

const ss = SpreadsheetApp.getActiveSpreadsheet(); const list = ss.getSheetByName("台帳") const csv = ss.getSheetByName("CSV用") const lastrowL = list.getRange(list.getMaxRows(),1).getNextDataCell(SpreadsheetApp.Direction.UP).getRow(); const lastrowC = csv.getRange(csv.getMaxRows(),1).getNextDataCell(SpreadsheetApp.Direction.UP).getRow(); for(let i = 2; i <= lastRowL; i++){ let range = list.getRange(i,3); let discri = range.getValue(); if(discri.indexOf('条件名')>=1){ continue } list.getRange(i,1).copeTo(csv.getRange(lastRowC+1,2,1,1),{contentsOnly:true}); }

最終行は関数を他のセルに入れているため、特定の列を使い取得しています。
iの値が変わるたびに最終行が更新される(貼り付けられた行が最終行となる)ようにできるのでしょうか

試したこと

開始行をiにすると条件を付けているので貼り付けがとびとびになってしまいました。
いくら調べても飛び飛びとなるiの値を順番に1行ごとに貼り付ける方法がわからなかったため、新規で登録し質問をさせていただきました。

1から勉強をしているわけではなく、やりたいことを調べながら少しずつ学んでいるため、至らないことが多々あるかと思いますが、ご指導いただけますと幸いです。

よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

難しく考えずに別の変数を使用してカウントすればよろしいかと思います。

JavaScript

1let r = 1; 2for(let i = 2; i <= lastRowL; i++){ 3 let range = list.getRange(i,3); 4 let discri = range.getValue(); 5 if(discri.indexOf('条件名')>=1){ 6 continue 7 } 8 list.getRange(i,1).copeTo(csv.getRange(lastRowC + r,2,1,1),{contentsOnly:true}); 9 r++; 10} 11

といった感じで行をコピーしたら1足せばいいのではないでしょうか。

投稿2023/09/23 11:15

YAmaGNZ

総合スコア10546

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

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

NANa

2023/09/23 23:20

素早い回答ありがとうございます。 なんとか1行でできないものかと悩んでおり、別の変数を用いることは全く頭になかったです... アドバイスいただきました処理で理想としていた動作が実現できました。 回答いただき、本当にありがとうございました。
guest

0

ベストアンサー

書き込み先の最終行を増やす処理を入れてみたらどうでしょうか。

js

1let lastrow = lastRowC; 2for(let i = 2; i <= lastRowL; i++){ 3 let range = list.getRange(i,3); 4 let discri = range.getValue(); 5 if(discri.indexOf('条件名')>=1){ 6 continue 7 } 8 list.getRange(i,1).copyTo(csv.getRange(lastrow+1,2,1,1),{contentsOnly:true}); // 修正 9 lastrow ++; // 追加 10}

(質問に記載されているコードは、誤りを含んでいて(上のコードでは一部直していますが)実際に実行されているものと異なるようですので、これをやってもうまく動かないかもしれません。なるべくコードは省略せず全部記載してください)

投稿2023/09/23 11:12

編集2023/09/23 11:17
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

NANa

2023/09/23 23:11

素早い回答ありがとうございました。 そのままのデータだとよくないかなと思い、質問用に一部変更していました。 ご迷惑をおかけしてしまい、申し訳ございません。次回以降は省略せず、記載したいと思います。 動作はご回答いただきました処理を加えることで解決できました。 長く悩んでいたので、本当に助かりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問