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

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

新規登録して質問してみよう
ただいま回答率
85.31%
Google Apps Script

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

Q&A

解決済

3回答

894閲覧

スプレットシートで行ごと、列の比較

miyaMm

総合スコア3

Google Apps Script

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

0グッド

0クリップ

投稿2022/10/11 05:45

GoogleApps Scriptでスプレットシートの比較をしたいのです。

同じスプレットシート内の
「E列の値」4038セル、「F列の値」4038セル
行単位で、イコールになっているか確認。

かつ、
E列の値は”D”のとき(E列にはADの文字列が入ります)
F列の値が”C”のとき(F列にもA
Dの文字列が入ります)
該当行のA列の値を出力する。

該当がなかった場合、なにもしない

for(var i =0; I< lastRow; i++)
で2列文のfor文の回し方がわからず。。。

大変、無知な質問をしており申し訳ございませんが、
宜しくお願い申し上げます。

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

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

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

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

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

Cocode

2022/10/11 06:02 編集

すみません私の理解力が足りず… Eの値とFの値が等しい時、 Aの値を出力する?(どこに?) それとも、E=F=D=C(4列がの値が全て等しい)の時、 Aの値を出力する?(どこに?) 具体的な表のイメージと、条件と、期待する結果が分かりませんすみません…!
Cocode

2022/10/11 05:58

あと、4038セルとは何の数字ですか?
miyaMm

2022/10/11 06:32

私の説明がおかしく大変申しわけございません。 A列に名前が入っております。 名前をG列に出力したいです。 E列=”D” F列=”C”の場合 A列の値を G列に出力 E列=”D” F列=”D”の場合 何もしない A~F列のデータの数が4038です。
Cocode

2022/10/11 06:38

ありがとうございます!4038行ということでしょうか。
Cocode

2022/10/11 06:48

1行目は、各項目名が入りますか?その場合無視しないといけないと思うので…。
miyaMm

2022/10/11 06:51

1行目は、各項目名が入ります。 4038行であっております。 説明が不十分で、申し訳ございません
YAmaGNZ

2022/10/11 06:54

>2列文のfor文の回し方がわからず ループ1つで終わるんじゃないですか?
hatena19

2022/10/11 07:03

とりあえず現状のコードを質問に追記したらどうでしょう。 あと、シートのスクリーンショットもアップしてもらうとイメージがつかめるので、 回答がつきやすいかと。
miyaMm

2022/10/11 09:09

申し訳ございません。 皆様のおっしゃる通り・・・ 以後、コードやシートのスクリーンショット等も載せるようにします。 ご回答、助言ありがとうございます。
guest

回答3

0

ベストアンサー

↓こんな感じのイメージでしょうか?

行\列ABCDEFG
1any9920020099
2any81000
3any24653424
(中略)
4038鹿any1004444100鹿

javascript

1function exampleFunc() { 2 const ss = SpreadsheetApp.getActiveSpreadsheet(); 3 const sheet = ss.getActiveSheet(); 4 const lastCol = 6; // データの最終列(F列) 5 const lastRow = sheet.getLastRow(); // データの最終行 6 const data = sheet.getRange(2, 1, lastRow-1, lastCol).getValues(); // データを取得 7 const result = []; // G列の値を格納する配列 8 9 // E=DかつF=Cなら、resultにAの値をいれる。違うなら、空文字をいれる 10 data.forEach(([A,_,C,D,E,F]) => (E == D && F == C) ? result.push([A]) : result.push([''])); 11 12 // resultの値をスプレッドシートG列に反映 13 sheet.getRange(2, lastCol+1, lastRow-1, 1).setValues(result); 14}

またはこちらでしょうか…?

行\列ABCDEFG
1anyanyanyDC
2anyanyanyDD
3anyanyanyCD
(中略)
4038鹿anyanyanyDC鹿

javascript

1function exampleFunc2() { 2 const ss = SpreadsheetApp.getActiveSpreadsheet(); 3 const sheet = ss.getActiveSheet(); 4 const lastCol = 6; // データの最終列(F列) 5 const lastRow = sheet.getLastRow(); // データの最終行 6 const data = sheet.getRange(2, 1, lastRow-1, lastCol).getValues(); // データを取得 7 8 // E="D"かつF="C"ならAの値を、違うなら空文字をいれてresultという配列をつくる 9 const result = data.map(([A,_,__,___,E,F]) => (E=='D' && F=='C') ? [A] : ['']); 10 11 // resultの値をスプレッドシートG列に反映 12 sheet.getRange(2, lastCol+1, lastRow-1, 1).setValues(result); 13}

解説

今回頭を悩ませたのが、4038行という行数の多さです。
GASは1日にGoogleスプレッドシートに書き込める回数に制限があります(回数というか実行時間というか…)。
ですので、1行ずつ条件判定&書き込みを行うと、上限をオーバーしてしまう危険性があり…。

よって、判定は1行ずつ行いますが、G列の値の結果だけ別の配列resultに格納しておき、全ての判定が終わった後にGの値を一括でスプレッドシートに書き込むようにしました。

他の方の回答の方がコードとしては綺麗なのですが、「1行ずつ読み込み → 1行ずつ判定 → 1行ずつ書き込み」を行なっていますので、おそらく実行時間が長くなるような気がします。
私のコードは「一括読み込み → 1行ずつ判定 → 一括書き込み」という処理です。

両方試してみてどちらも問題なさそうでしたら、お好みの方を選んでいただいたらいいと思います。

投稿2022/10/11 07:32

編集2022/10/11 08:29
Cocode

総合スコア2316

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

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

miyaMm

2022/10/11 09:01

ありがとうございます。 exampleFunc2で実行してみました。うまくじ 説明が不足している中、イメージ通りのコードで大変助かりました。 4038行の実際のデータで活用できそうなので、使用させていただきます。 ありがとうございました!
guest

0

E列=”D” F列=”C”の場合 A列の値を G列に出力

上記のとおりなら、下記のコードになります。

JavaScript/GAS

1unction sample() { 2 const sheet = SpreadsheetApp.getActiveSheet(); 3 const lastRow = sheet.getLastRow(); 4 for(let i = 2; i <= lastRow; i++) { 5 if(sheet.getRange(i,5).getValue()==="D" && sheet.getRange(i, 6).getValue()==="C"){ 6 sheet.getRange(i, 7).setValue(sheet.getRange(i, 1).getValue()) 7 }; 8 } 9}

投稿2022/10/11 07:32

hatena19

総合スコア34362

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

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

miyaMm

2022/10/11 09:04

ご回答ありがとうございます。 for文の条件分岐が理解足りないままの質問になってしまい、申し訳ございません。 ご回答頂いたコードで、試してみます! ありがとうございました。
guest

0

for(var i =0; i< lastRow; i++){ // i行目のE列のデータを取得 // i行目のF列のデータを取得 // E列のデータとF列のデータが条件通りなら if (~) { // 処理をする } }

ということなのではないですか?

投稿2022/10/11 07:15

YAmaGNZ

総合スコア10555

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

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

miyaMm

2022/10/11 09:07

ご回答ありがとうございます。 for文の中に書く処理が理解できていなかったため、 大変助かりました。 説明が曖昧な中ご回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問