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

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

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

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

JavaScript

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

Q&A

解決済

2回答

1780閲覧

【GAS】指定した項目を表から探して、毎日件数を取得する【画像あり】

w_k31

総合スコア13

Google Apps Script

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

JavaScript

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

0グッド

0クリップ

投稿2020/10/29 06:54

編集2020/10/30 03:01

ゴール

下記の図のようなものを作成しようと思ってます。

黒の箱を左からA,B,C,Dとした場合、
別の表からそれぞれの件数を取得して、
該当する日付の行に毎日記録する処理になります。
指定した項目を表から探して、毎日件数を取得する

なぜここで質問したか

関数で色々と試したが、かなり複雑になりすぎて、現実的ではないと考えました。
また、自社のエンジニアに作成依頼をしましたが、難しいと言われました。
この処理がどれだけ難しいのか判断がつかないのは申し訳ないですが、
どうか宜しくお願いします。

編集・追記依頼

例えば別の表の2020/10/20のA, B, C, Dについて、質問文中に提示の黄色のスプレッドシートの2020/10/20の行、
A, B, C, Dにセットするわけですね。実行したい処理には「追記」するとありますが、ここで言う追記とはどのような処理でしょうか。
「転記」なら何となく上書きな感じがしますが、「追記」となると横方向に追加していくのか、それともそれぞれ合算していくのか。

∟上手く説明が出来ておらず、すみません!

A:りんご, B:なし, C:ぶどう, D:かきとした場合
(本来は、弊社の商品名になります。)

列1取得したい列
行1りんご
行2なし
行3ぶどう
行4かき
行5りんご
行6りんご
行7ぶどう

上記のように別タブに表があり、それの一部の列を毎日取得する感じになります。

この場合は、処理を走らせると、
左から[3,1,2,1]と処理日と該当する日付の行に入力されます。
(りんご:3件、なし:1件、ぶどう:2件、かき:1件)

また、次の日にも取得したい列でそれぞれの件数を取得し、
それを毎日繰り返すことを想定してます。

(※取得したい列の更新の有無に限らずです)

ですので、上書きや合算とも違うのかなと考えております。
(書いていて「追記」では無いなと気付きました。)

前日の件数は無視して、常にその日の件数を取得して、記録していきたいです。

最終的にこれをGoogle data portalで読み込ませて、日別の積立グラフを作成します。

細かい部分が不明ではありますが、GASで目的を達するにはそう難しい処理には思えません。
しかしながらそのコードをここで求めるのは作業依頼で、非推奨なことだと思います。

∟甘えがありました。申し訳ございません。
こういうメソッド等で解決できるといったヒントであれば可能でしょうか。
それを元に、試行錯誤して作成してみようと思います。

あるいは質問者さんの会社のエンジニアが「難しい」といったのは、
実は質問文中には触れられていない要件があったりするのではありませんか。
であるからGASでプログラミングしても難しい、と判断されたとか。

∟上手く説明しきれていない所もあると思います。
また、横やりのタスクなので、すぐに対応するのは難しいという意味もあると考えてます。

ちなみにGASに関する質問なのであれば、"Google Apps Script"のタグがあるので追加してください。
それを付けることで他の閲覧者さん、回答者さんに多く目に留まるようになります。

∟追加しました!
ありがとうございます。

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

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

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

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

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

dodox86

2020/10/29 07:05

例えば別の表の2020/10/20のA, B, C, Dについて、質問文中に提示の黄色のスプレッドシートの2020/10/20の行、A, B, C, Dにセットするわけですね。実行したい処理には「追記」するとありますが、ここで言う追記とはどのような処理でしょうか。「転記」なら何となく上書きな感じがしますが、「追記」となると横方向に追加していくのか、それともそれぞれ合算していくのか。 細かい部分が不明ではありますが、GASで目的を達するにはそう難しい処理には思えません。しかしながらそのコードをここで求めるのは作業依頼で、非推奨なことだと思います。
dodox86

2020/10/29 07:08

あるいは質問者さんの会社のエンジニアが「難しい」といったのは、実は質問文中には触れられていない要件があったりするのではありませんか。であるからGASでプログラミングしても難しい、と判断されたとか。
dodox86

2020/10/29 07:12

ちなみにGASに関する質問なのであれば、"Google Apps Script"のタグがあるので追加してください。それを付けることで他の閲覧者さん、回答者さんに多く目に留まるようになります。
w_k31

2020/10/29 08:02

>>dodox86 さん 質問ありがとうございます。全て回答して修正しております。 確認お願いします。
dodox86

2020/10/30 01:54

質問文中に新しく追加された表について、唐突に出てきた△,〇とA,B,C,D...の関連がよく分かりませんので回答に躊躇するところです。たぶん、この表では本質問を閲覧した方には分かりません。 順不同で重複するA,B,C,Dにそれぞれ件数が入っている、ようなイメージなのでしょうか? A=10件, A=20件と複数入っているような。
dodox86

2020/10/30 02:00

尚、私が分からないだけかもしれず、その為にコメントで指摘しているだけです。必ずしも回答できるとは限りませんし、回答するとしてもコードを書くことはなさそうなので、お気づかいにはおよびません。お任せします。
w_k31

2020/10/30 03:01

>>dodox86 さん ありがとうございます! 再度修正しました。
sawa

2020/11/02 02:34

すでに dodox86さんが回答書かれてますが、いろんなやり方があると思いますし、クリティカルなものでなければ、自分が出来る範囲で作ってみて徐々に改善すればよいかと思います。 例えば「検索してヒットした行に」が難しければ、最終行に日付を含めて追記してく形でも良いかと思います。それだと、先に日付を手動で用意しておく手間もないですしね。 他にも スクリプト側で 今日の日付を取得してフォーマットを整えるとか、それぞれの個数を求めるとかが難しい場合も、 TODAYやCOUNTIFでスプレッドシート上で取得させたものを 毎晩 1日回のトリガーで 単純にコピー → 最終行の下に値を貼り付けでも良いかと。 別の表(毎日追加されていく?)側にタイムスタンプの列があれば、ピボットで集計もできるし、GAS使わなくてもよさそうですが。
w_k31

2020/11/02 05:07

>>sawa さん |最終行に日付を含めて追記していく dodox86さんの参考にしながら作成する際に難しく考えすぎだなと思い、 その方法で作成しておりました。 |単純にコピー → 最終行の下に値を貼り付け 「はっ」とさせられました・・。その方法でも叶えたい形にはなりますね!! ありがとうございます!!
guest

回答2

0

解決のヒントになったのは、sawaさんですが、dodox86さんには何度も助けて頂いたので、
ベストアンサーにさせて頂きました。

実際に解決した処理は

JavaScript

1function number() { 2 function getUsedRowCount(sheet, rowName) { 3 var values = sheet.getRange(rowName + ':' + rowName).getValues(); 4 return values.filter(String).length; 5} 6var ss_copyFrom = SpreadsheetApp.openById('スプレッドシートID'); 7var ss_copyTo = SpreadsheetApp.openById('スプレッドシートID'); 8var sheet_copyFrom = ss_copyFrom.getSheetByName('コピー元'); 9var sheet_copyTo = ss_copyTo.getSheetByName('コピペ先'); 10var copyValue = sheet_copyFrom.getRange('B3:G3').getValues(); 11var targetRow = getUsedRowCount(sheet_copyTo, 'A') + 1; 12sheet_copyTo.getRange('A'+targetRow+':F'+targetRow).setValues(copyValue); 13}

こんな感じになります。

集計自体はcountifで行い、GASでそれをコピーして別タブに貼り付けていく処理にしました!

投稿2020/11/19 08:38

w_k31

総合スコア13

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

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

dodox86

2020/11/19 08:49

より良いかたちで解決できてよかったです。ループの考え方はプログラミングでは普通に良く使うので、また別の機会に必要性に応じて使えばよいと思います。
w_k31

2020/11/19 09:06

>>dodox86 さん 返事が遅くなってしまい、すみませんでした! 報告が出来て良かったです! 基本的に考え方をしっかりと見に付けます。
guest

0

ベストアンサー

特殊な処理はなく、以下のような流れで要望を満たすプログラムはおおむね作れるはずです。

  1. 本日分のデータが記入されたシートAから、データが存在する分だけループし、品名ごとに件数を求める。
  2. 1.で求めた日付とデータをもとに、別のシートBの該当する日付の行を探す。
  3. 2.に合致するシートBの行において、品名ごとのカラムに件数を転記する。

 ここでシートAにおいて本日分のデータが無かった場合、シートBの前の行からデータをコピーし、転記する。

しかしながら現状、質問者さんにとって取っ掛かりが無さすぎかもしれませんので、サンプルとしてコードをご紹介します。

[2020/10/30 12:00]に修正、追記された記述内容について:

上記のように別タブに表があり、それの一部の列を毎日取得する感じになります。

この表に準じたシートから、品名ごとの件数を求めるGoogle Apps Scriptサンプルコードです。

GAS

1function test33() { 2 3 // 現在アクティブのスプレッドシートから"TEST33"シートを取得 4 let ss = SpreadsheetApp.getActiveSpreadsheet(); 5 let sheet = ss.getSheetByName("TEST33"); 6 7 // 1~7行間をループし、品ごとの数量を求める。 8 var item_num = []; 9 for (let i = 1; i <= 7; i++) { 10 let range = sheet.getRange(i, 2); 11 let values = range.getValues(); 12 Logger.log(values[0][0]); 13 14 let k = values[0][0]; 15 if (k in item_num) { 16 item_num[k] += 1; 17 } else { 18 item_num[k] = 1; 19 } 20 } 21 22 // 現在日時(ローカル時間)を取得 23 let now = new Date(); 24 let year = now.getFullYear(); 25 let month = now.getMonth() + 1; 26 let date = now.getDate(); 27 28 // 9行目に現在年月日を出力 29 let s = year + "年" + month + "月" + date + "日"; 30 sheet.getRange(9, 2).setValue(s); 31 32 // 11行目から集計結果を出力 33 let i = 11; 34 for (let k in item_num) { 35 Logger.log('item=' + k + ', num=' + item_num[k]); 36 sheet.getRange(i, 2).setValue(k); 37 sheet.getRange(i, 3).setValue(item_num[k]); 38 ++i; 39 } 40}

これを実行すると"TEST33"のシートにおいて下画像のようになります。

イメージ説明

サンプルはあえて冗長に、愚直に書いた部分があります。ループで各セルにアクセスしていますが、大量のデータになると遅くなることがあります。そんな場合は範囲指定で一気にアクセスするようにもできます。(方法はここでは割愛します)

GAS特有であるスプレッドシートのクラスに関する公式の情報は、リファレンスを参照してください。
Spreadsheet Service - Google Apps Script

本質問はGoogle Apps Script、それもGoogleスプレッドシートに関連したものですが、プログラムの流れの基本、考え方はExcel/VBAにも転用できるはずです。自力でプログラムを書けるようになれば、応用が効くのではないでしょうか。がんばってください。

投稿2020/10/31 02:47

編集2020/10/31 07:28
dodox86

総合スコア9183

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

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

w_k31

2020/11/01 16:41

ありがとうございます! dodox86さんを参考に色々やってみます! 上手く動作すれば、後ほどベストアンサーにします! 現時点では回答を受付中にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問