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

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

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

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

JavaScript

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

Q&A

解決済

1回答

1936閲覧

[GAS]二次元配列同士を特定のキーで比較してレコードごと取り出す

moro_05

総合スコア4

Google Apps Script

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

JavaScript

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

1グッド

1クリップ

投稿2023/01/31 13:12

実現したいこと

A、B、2つのシートにある二次元配列からメールアドレスをキーにして比較したい。

シートA
イメージ説明

シートB
イメージ説明

結果
イメージ説明

理想
イメージ説明

前提

Aの表にあってBの表にないメールアドレスがあった場合は、
該当のメールアドレスのレコードごと新しくシートに転記するようなスクリプトを組んでいます。

今の書き方だとA、B、両方のメールアドレスに対して全ての組み合わせで比較してしまっているので、
結果を出力するとAのシートがそのまま出力されてしまいます。
二次元配列同士の特定のキーを比較する記事などが見つからず苦戦しています。
どのように書けばよろしいでしょうか。

また、実際はデータの数が大量にあるので、
for文ではない方がよければ、そちらも併せてご教授いただければ幸いです。

該当のソースコード

function myFunction() { var SS = SpreadsheetApp.getActiveSpreadsheet(); //シートAを取得 var Sheet_a = SS.getSheetByName('シートA'); // 2行目以降の全データを取得 var Adat = Sheet_a.getDataRange().getValues().slice(1); //シートBを取得 var Sheet_b = SS.getSheetByName('シートB'); // 2行目以降の全データを取得 var Bdat = Sheet_b.getDataRange().getValues().slice(1); //結果シートを取得 var CheckSheet = SS.getSheetByName('結果'); //結果格納用の配列 var Check=[]; for(var i=0;i<Adat.length;i++){ for(var k=0;k<Bdat.length;k++){ if(Adat[i][1]!=Bdat[k][1]){ Check.push(Adat[i]) } } } CheckSheet.getRange(2,1,Adat.length,Adat[0].length).setValues(Adat); }
Cocode👍を押しています

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

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

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

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

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

Cocode

2023/01/31 17:56 編集

質問の仕方がすごく分かりやすく好印象です!スプレッドシートの画像の掲載ありがとうございます。コード書いてみます。
guest

回答1

0

ベストアンサー

修正内容

  • Bdatの配列を2次元配列ではなく、1次元配列に変更する処理をしました。
    • 値はメールアドレスのみとしました。
    • 私のコードではemailAddressesという名称にしています。
  • .filter()メソッドを利用して、Adat(私のコードではvaluesAという名称)の配列を、条件に一致するレコード(行)だけに絞るようにしました。
  • 変数varを → 定数constに変更しました。
    • varは古い変数の定義方法ですので使用しないでください。欠点があるため、新しい定義方法が追加されました。
    • 定数はconst、変数はletを使用するようにしてください。
    • 使い分けがよく分からない場合はとりあえず全て変数letにするといいと思います。
  • 変数名(定数名)を変更しました。
    • JavaScriptでは一般的に普及している、識別子の命名規則があります。
    • 大文字・小文字の使い方には意味があり、先頭を大文字にするのはclass名を意味します。
    • ですので、変数名の先頭を大文字にしないでください。

コード例

javascript

1function myFunction() { 2 const ss = SpreadsheetApp.getActiveSpreadsheet(); 3 4 const sheetA = ss.getSheetByName('シートA'); 5 const valuesA = sheetA.getDataRange().getValues().slice(1); 6 7 const sheetB = ss.getSheetByName('シートB'); 8 9 // 2行目以降の全データを取得し、メールアドレスの値のみの一次配列化する 10 const emailAddresses = sheetB.getDataRange().getValues().slice(1).map(record => record[1]); 11 console.log(emailAddresses); 12 13 const resultSheet = ss.getSheetByName('結果'); 14 15 // 結果格納用の配列。 16 // valuesAのメールアドレスがemailAddressesに含まれていない行のみに絞る。 17 const results = valuesA.filter(record => !emailAddresses.includes(record[1])); 18 console.log(results); 19 20 resultSheet.getRange(2, 1, results.length, results[0].length).setValues(results); 21}

投稿2023/01/31 20:03

Cocode

総合スコア2314

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

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

moro_05

2023/02/06 02:42

回答ありがとうございます。 変数の書き方についても勉強になりました。これを機にこちらの書き方で統一するようにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問