🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Google スプレッドシート

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

Google Apps Script

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

Q&A

解決済

1回答

2486閲覧

[GAS][Googleスプレッドシート] あるセルの値と一致しているものだけ別シートに抽出する方法

saider_san

総合スコア14

Google スプレッドシート

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

Google Apps Script

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

0グッド

1クリップ

投稿2020/11/28 12:28

やりたいこと

・allシートには以下のような表があります。
イメージ説明

オレンジ枠のID,担当者,メールアドレスの表から
水色枠の抜き出したいIDに記載のある文字と一致しているものがあれば全て抜き出して
それを別シートへコピーする というのをスクリプト実行でやりたいというのが本件になります。

表内で=FILTER関数であれば以下のようにすれば抽出可能なのですが、

=FILTER(A4:C, COUNTIF(A4:C,E4:E))

スクリプトでの書き方が分からず苦戦しています。

現在は以下のように、A4:Cの項目を別シートへそのままコピーするという、
スクリプト実行まではできています。

function copy() { var ss = SpreadsheetApp.openById('スプレッドシートID'); // 該当スプレッドシートの範囲を取得 var copyFrom = ss.getSheetByName('all').getRange('A4:C'); // コピー先スプレッドシートとコピー開始セルを指定 var copyToSheet = ss.getSheetByName('select').getRange('A2'); // copyFromを =FILTER(A4:C, COUNTIF(A4:C,E4:E))の条件に一致したものだけにしたい copyFrom.copyTo(copyToSheet); }

copyFrom.copyTo(copyToSheet)としておりますが、
ここのcopyFromを=FILTER(A4:C, COUNTIF(A4:C,E4:E))のものだけにしたいのですが
なかなかうまくいかず、質問投稿させていただいた次第です。

詳しい方がおりましたら、ご教示いただけますと幸いです。
よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

表内で=FILTER関数であれば以下のようにすれば抽出可能なのですが、
=FILTER(A4:C, COUNTIF(A4:C,E4:E))

この関数式では要件を満たさない気がしますがそれはともかく、Range.setFormula を使えば GAS から関数式を設定できます。

Class Range > setFormula

https://developers.google.com/apps-script/reference/spreadsheet/range?hl=en#setformulaformula

JavaScript

1function copy() { 2 const ss = SpreadsheetApp.openById("スプレッドシートID"); 3 4 //"select"シートの"A2"セルに関数式を設定する 5 const formula = `=FILTER(all!A4:C, COUNTIF(all!A4:C, all!E4:E))`; 6 ss.getSheetByName("select").getRange("A2").setFormula(formula); 7}

元データを自分でフィルタしてから"select"シートへコピーする方法もあります。

JavaScript

1function copy2() { 2 const ss = SpreadsheetApp.openById("スプレッドシートID"); 3 const allSheet = ss.getSheetByName("all"); 4 5 const values = allSheet.getRange("A4:C").getValues(); 6 const selectedIDs = allSheet.getRange("E4:E").getValues().flat(); 7 8 const selectedValues = values.filter(rowData => 9 selectedIDs.includes(rowData[0]) 10 ); 11 12 const selectSheet = ss.getSheetByName("select"); 13 selectSheet.getRange("A2:C").clearContent(); 14 if (0 < selectedValues.length) { 15 selectSheet 16 .getRange(2, 1, selectedValues.length, 3) 17 .setValues(selectedValues); 18 } 19}

投稿2020/11/29 00:48

編集2020/11/29 02:20
draq

総合スコア2577

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

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

saider_san

2020/11/29 07:12

まさにやりたいこと、そのものの回答をいただきまして、 誠にありがとうございます! copy2の方の元データを加工するのをずっとやりたかったのですが なかなか上手くいかず、、記載いただいた内容で無事抽出されました! どちらのやり方も大変勉強になりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問