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

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

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

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

Q&A

解決済

1回答

3381閲覧

GASを使ってcountifs関数と同じ動作をさせたい

kitaru

総合スコア21

Google Apps Script

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

0グッド

0クリップ

投稿2023/02/21 03:57

編集2023/02/22 15:22

実現したいこと

  • GASを使ってcountifs関数と同じ動作をさせたい
  • 「シートA」から複数条件に当てはまるデータ数をカウントアップし、「シートB」の特定セルに記載したい
  • その条件は「シートB」に記載してある日時やキャンペーン名(文字列)と一致するデータを「シートA」から抽出し該当データ数をカウントする

前提

GASでレポート作成の自動化を行いたく、countifs関数のような動作をするGASを実装させたいのですが
エラーが発生してしまいました。

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

Exception: パラメータ(String)が SpreadsheetApp.Sheet.getDataRange のメソッドのシグネチャと一致しません。

該当のソースコード

Google

1function GenerateDailyOfferReport() { 2var sheetA = SpreadsheetApp.getActive().getSheetByName("シートA").getDataRange().getValues(); 3var sheetB_Date = SpreadsheetApp.getActive().getSheetByName("シートB").getRange("A3:A33").getValues(); 4var sheetB_Campaign = SpreadsheetApp.getActive().getSheetByName("シートB").getRange("C1").getValues(); 5var sheetB_Offer = SpreadsheetApp.getActive().getSheetByName("シートB").getRange("B2:Z2").getValues(); 6 7 for(var i = 1; i < sheetA.length; i++) { 8 var date = sheetA[i][2]; 9 var status = sheetA[i][3]; 10 var campaign = sheetA[i][16]; 11 var offer = sheetA[i][9]; 12 13 if (date == sheetB_Date && status == 900 && campaign == sheetB_Campaign && offer == sheetB_Offer){ 14 var data = SpreadsheetApp.getActive().getSheetByName("シートB").getRange(i +2, 1).setValue(); 15 16 } 17 } 18}

参考キャプチャ

元データ
イメージ説明

抽出先
イメージ説明

試したこと

for文やif文の条件を何度か修正しているのですが、行き詰まってしまい
ヒントなど頂けたら嬉しいです

補足情報(FW/ツールのバージョンなど)

Google App Script

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

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

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

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

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

bebebe_

2023/02/21 04:14

とりあえず現状の問題としては「getDataRange()」はデータがあるすべての範囲を取得します。 範囲を指定する場合は「getRange()」を使って「getRange("A3:A33")」のようにします。
kitaru

2023/02/21 05:46

ご指摘ありがとうございます。 頂いた内容で修正したらエラーは出なくなったのですが、Valueがアウトプットされない状態です。 カウントアップした数字を出すためのヒントがあれば、いただけると嬉しいです。
bebebe_

2023/02/21 07:11

すみません、実現したい動作がうまく理解出来ていないです。模擬的なシートのスクリーンショット等あると助かります。 とりあえず問題がありそうなのはif文で「sheetB_Date」等は2次元配列対なので「date」等の値とは=にならないと思います。 配列内に指定の要素があるのか判定したいのなら「includes」を使うことになるとは思います。
kitaru

2023/02/21 09:14

ありがとうございます。 参考キャプチャを添付しました。「元データ」から該当するデータを抽出して「抽出先」に該当するデータの数を記載していくイメージです。 どうぞよろしくお願いいたします。
guest

回答1

0

ベストアンサー

やりたいこととしてはこんな感じでしょうか

function GenerateDailyOfferReport() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheetA = ss.getSheetByName("シートA").getDataRange().getValues(); const sheetB_Date = ss.getSheetByName("シートB").getRange("A3:A33").getValues(); const sheetB_Campaign = ss.getSheetByName("シートB").getRange("C1").getValues(); const sheetB_Offer = ss.getSheetByName("シートB").getRange("B2:Z2").getValues(); const sheetB_Date_Flat = sheetB_Date.flat(); const sheetB_Campaign_Flat = sheetB_Campaign.flat(); const sheetB_Offer_Flat = sheetB_Offer.flat(); for(let i = 0; i < sheetB_Date_Flat.length; i++){ for(let j = 0; j < sheetB_Offer_Flat.length; j++){ for(let k = 0; k < sheetB_Campaign_Flat.length; k++){ const arrayFilter = sheetA.filter(value => value[0] == String(sheetB_Date_Flat[i]) && value[1] == 900 && value[2] == sheetB_Offer_Flat[j] && value[3] == sheetB_Campaign_Flat[k]); ss.getSheetByName("シートB").getRange(3 + i, 2 + j).setValue(arrayFilter.length); } } } }

投稿2023/02/22 02:30

bebebe_

総合スコア497

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

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

kitaru

2023/02/22 06:22

こんな感じです!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問