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

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

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

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

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

1396閲覧

GASを使用したデータの集計方法について

yamadaman_q

総合スコア22

Google Apps Script

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

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

1クリップ

投稿2021/05/13 01:14

宜しくお願いします。

現在webからHTMLのフォームに入力されたデータをDB替わりのスプレッドシートに溜めていき、分析したい場合はHTML上で年度を選択してボタンを押すとDBから条件をもとにデータが集計され表示されるというプログラムを組んでいます。

そこで質問なのですが、現在はDBのデータをすべて取得して、その中から年度と月と選択区分を条件でフィルタリングし、配列のlengthで件数を取得するやり方をとっているのですが、無駄にソースが長くなっていってわかりづらいので、なにかほかに年度を指定した際の配列の要素数を取得するシンプルな方法があればご教授頂きたいのです。

gas

1//2次格納用配列 2 var ary_list = []; 3 4 /*相談件数データ************************************************************************************************************************************************************************************************/ 5 var inv04 = mst.filter(function(e){return e[44] === e_year && e[45] === "04" && e[10] === "相談"}); 6 var inv05 = mst.filter(function(e){return e[44] === e_year && e[45] === "05" && e[10] === "相談"}); 7 var inv06 = mst.filter(function(e){return e[44] === e_year && e[45] === "06" && e[10] === "相談"}); 8 var inv07 = mst.filter(function(e){return e[44] === e_year && e[45] === "07" && e[10] === "相談"}); 9 var inv08 = mst.filter(function(e){return e[44] === e_year && e[45] === "08" && e[10] === "相談"}); 10 var inv09 = mst.filter(function(e){return e[44] === e_year && e[45] === "09" && e[10] === "相談"}); 11 var inv10 = mst.filter(function(e){return e[44] === e_year && e[45] === "10" && e[10] === "相談"}); 12 var inv11 = mst.filter(function(e){return e[44] === e_year && e[45] === "11" && e[10] === "相談"}); 13 var inv12 = mst.filter(function(e){return e[44] === e_year && e[45] === "12" && e[10] === "相談"}); 14 //年度繰り越し 15 var inv01 = mst.filter(function(e){return e[44] === strYear && e[45] === "01" && e[10] === "相談"}); 16 var inv02 = mst.filter(function(e){return e[44] === strYear && e[45] === "02" && e[10] === "相談"}); 17 var inv03 = mst.filter(function(e){return e[44] === strYear && e[45] === "03" && e[10] === "相談"}); 18 19 //件数 20 var sou04 = inv04.length; 21 var sou05 = inv05.length; 22 var sou06 = inv06.length; 23 var sou07 = inv07.length; 24 var sou08 = inv08.length; 25 var sou09 = inv09.length; 26 var sou10 = inv10.length; 27 var sou11 = inv11.length; 28 var sou12 = inv12.length; 29 var sou01 = inv01.length; 30 var sou02 = inv02.length; 31 var sou03 = inv03.length; 32 //年度合計数 33 var sou_sum = sou04+sou05+sou06+sou07+sou08+sou09+sou10+sou11+sou12+sou01+sou02+sou03; 34 //年度平均 35 var sou_ave = sou_sum/12; 36 var sou_fix = sou_ave.toFixed(1); 37 //1次配列格納用 38 var ary_sou = []; 39 //格納 40 ary_sou.push(sou04); 41 ary_sou.push(sou05); 42 ary_sou.push(sou06); 43 ary_sou.push(sou07); 44 ary_sou.push(sou08); 45 ary_sou.push(sou09); 46 ary_sou.push(sou10); 47 ary_sou.push(sou11); 48 ary_sou.push(sou12); 49 ary_sou.push(sou01); 50 ary_sou.push(sou02); 51 ary_sou.push(sou03); 52 ary_sou.push(sou_sum); 53 ary_sou.push(sou_fix);

js

1//ラベルを入れる 2 var html = "<table class='table table-bordered' id='table3'>" 3 4 html += "<thead>" 5 html += "<tr>" 6 html += "<th scope='col'> </th>" 7 html += "<th scope='col'>4月</th>" 8 html += "<th scope='col'>5月</th>" 9 html += "<th scope='col'>6月</th>" 10 html += "<th scope='col'>7月</th>" 11 html += "<th scope='col'>8月</th>" 12 html += "<th scope='col'>9月</th>" 13 html += "<th scope='col'>10月</th>" 14 html += "<th scope='col'>11月</th>" 15 html += "<th scope='col'>12月</th>" 16 html += "<th scope='col'>1月</th>" 17 html += "<th scope='col'>2月</th>" 18 html += "<th scope='col'>3月</th>" 19 html += "<th scope='col' class='border_b'>年度合計</th>" 20 html += "<th scope='col' >年度平均</th>" 21 html += "</tr>" 22 html += "</thead>" 23 24 html += "<tbody>" 25 26 html += "<tr>" 27 html += "<td>相談件数</td>" 28 //4月 29 html += "<td align='right'>" + json[0][0] + "</td>" 30 //5月 31 html += "<td align='right'>" + json[0][1] + "</td>" 32 //6月 33 html += "<td align='right'>" + json[0][2] + "</td>" 34 //7月 35 html += "<td align='right'>" + json[0][3] + "</td>" 36 //8月 37 html += "<td align='right'>" + json[0][4] + "</td>" 38 //9月 39 html += "<td align='right'>" + json[0][5] + "</td>" 40 //10月 41 html += "<td align='right'>" + json[0][6] + "</td>" 42 //11月 43 html += "<td align='right'>" + json[0][7] + "</td>" 44 //12月 45 html += "<td align='right'>" + json[0][8] + "</td>" 46 //1月 47 html += "<td align='right'>" + json[0][9] + "</td>" 48 //2月 49 html += "<td align='right'>" + json[0][10] + "</td>" 50 //3月 51 html += "<td align='right'>" + json[0][11] + "</td>" 52 //年度合計 53 html += "<td align='right' class='border_c'>" + json[0][12] + "</td>" 54 //年度平均 55 html += "<td align='right'>" + json[0][13] + "</td>" 56 html += "</tr>" 57

上記のような組み方だと1項目集計するだけでこんな書き方になっちゃいます。
HTML上で帳票みたいな集計表示をしていくとなるとやむなしなのかなと思っていたのですがちょっとでも簡略化できればと思いましてご質問させて頂きました。

よろしければアドバイス頂けますと幸いです。

宜しくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

なかなか冗長になってますね。。。

SS(スプレッドシート)上でsql文使えるのでそれを使うのも手かもしれません。
Google SpreadsheetでSQLが書ける?Query関数が便利な件。

共通の箇所が多いのでfor文で減らすことは可能だと思います。

また、DB上の日付をunixタイムに変更して(もしくは1列追加)して、その差異によって期間中のデータを抽出した方が簡単かもしれません。
その場合は、dayjs等の日付操作のライブラリの使用をおすすめします。

dayjsの使い方

gas

1 2//検索したいを含む日付を選択 複数ある場合は、 配列にして["2021/4/1,"2021/5/1"]回して下さい。 3var period = "2021/5/1" 4var periodMonth = dayjs.dayjs(period).format("YYYY年MM月) 5 6var start = dayjs.dayjs(period).startOf('month').unix() //2021/5/1 0:00:00の unixタイム => 1619794800 7var end = dayjs.dayjs(period). endOf('month').unix() //2021/5/31 23:59:59の unixタイム => 1622473199 8 9 10//DBの全データを取得 11var values = sheet.getDataRange().getValues() 12 13//検索結果 結果を連想配列の形式にして保存する。 14var reslust = {} 15 16 17//valuesの配列を全て確認 18values.forEach((e)=>{ 19 var taskDate = e["日付のindex"]; // Db上の日付 unixであればそのまま、YYYY/MM/DD 形式なら、dayjsでunixタイムに変換 20 var taskName = e["項目のindex"]; 21  22 //この比較で対象期間にあるDBの値を取得できます。 23 if(start < taskDate && taskDate < end && taskName=="相談"){ 24   reslust[periodMonth].push(e) 25 } 26}) 27 28//デバッグ等で中身を確認いただくとこんな感じになっているはずです。 29reslust = {2021年5月:[DBの該当する行の情報1,DBの該当する行の情報2,DBの該当する行の情報3,]} 30 31 32//あとは、このreslustを加工してあげてばいいかと思います! 33 34 35 36

わざわざunixタイムにしなくても、dayjsで直接比較できますが、都度dayjsを通すので件数が多いと処理が遅くなりそうなので、あらかじめunixタイムにしておけば普通の比較だけで処理が可能です。

for分に関しても、valuesが日付どおりに並んでいるのであれば途中でbreak等で止めてもいいと思います。

gasやノーマルのjsは日付操作が非常に面倒なので、こういった日付操作のライブラリを使うと便利です。

html側に関しては innerHTMLとfor分を使って作る方法もあります。
https://developer.mozilla.org/ja/docs/Web/API/Element/innerHTML

gasでも使えるvueなどのフレームワーク入れてあげるとさらに楽に作れてと思いますよ!

投稿2021/05/13 05:06

Tatsunosuke

総合スコア599

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

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

yamadaman_q

2021/05/13 05:37

非常にわかりやすい説明ありがとうございます。 参考にさせて頂きます。
Tatsunosuke

2021/05/13 05:53

お役に立てたようであれば幸いです! 同じようなものは、僕もいくつか作りましたので使える部分もあるかと思います。 もし、jsに不慣れでしたら、forEachや連想配列、dayjsなど理解がしにくい部分もあるかもしれませんが、 このあたりを使えるようになれば、ぐっと進みやすくなると思います! 頑張ってください!応援してます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問