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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Google スプレッドシート

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

Google Apps Script

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

Q&A

0回答

466閲覧

forとifの多重ループでの統計を行いたいです。

biisuto00

総合スコア3

Google スプレッドシート

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

Google Apps Script

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

0グッド

1クリップ

投稿2021/03/26 07:13

前提・実現したいこと

初心者です。よろしくお願いします。
現在GASで1日1回統計をしていくスクリプトを作成しています。
長くなるかもしれませんがよろしくお願いします。

現在スプレッドシートである一定の人数を審査しています。
審査をする人は10人いて、毎日審査する人も変わります。
審査をした人は審査が合格か不合格か・名前・日付を書いていきます。

スプレッドシートでは
【合格可否 名前  日付】 3/26
合格   Aさん 3/26
不合格  Bさん 3/26
不合格  Aさん 3/26
といった風になっています。

不合格の人は合格になるまで何度でも確認する為、その度に名前と日付が更新されます。
次の日には
【合格可否 名前  日付】 3/27
合格   Aさん 3/26
不合格  Aさん 3/27
不合格  Bさん 3/27
といった風になります。

ここでGASでやりたい統計ですが、本日審査した人が合格にした数、不合格にした数を一日ごとに統計したいです。
COUNTIFSにすると=COUNTIFS(A:A,"合格",B:B,"ABCDEFGHIJさん(10人分)",C:C,TODAY())になると思います。
こちらをGASで一日一回10人分をループを使って当日合格不合格の数を統計してスプレッドシートに出力したいと考えています。

統計の方法はforとifを組み合わせた多重ループでの統計をしたいです。
一致した回数だけ予め入れておいた変数に+1をするというやり方で数を取りたいです。

まずA1:D3までの二次元配列を所得します。(変数p)
forを使いループ初期化式[i]を作ります。
その後Ifを使ってp[i][0]が合格であるかを調べます
その中にifを作りp[i][1]が【Aさん】であるかを調べます
更にその中にifを作りp[i][3が当日であるかを調べます
この3つのifがtureだった時に 予め作っておいた配列stsarry【?】に+1します。

問題はここからで上記の【】の部分、Aさんと予め作った配列にも配列を作り、for初期化式を埋め込みたいです。(多重ループ)
手順としては

1ループ目は
二次元配列p[i][1](配列の1番目の1番目)は合格であり、p[i][2]は【配列の1番目】さんであり、p[i][3は]当日である
true

stsarry【配列の1番目】に+1

2ループ目
二次元配列p[i][1](配列の1番目の1番目)は合格であり、p[i][2]は【配列の2番目】さんであり、p[i][3]は当日である
true

stsarry【配列の2番目】に+1

こういった感じでstsaryyにどんどん数値を入れていって最後に表に載せたいです。
以下のコードでは初期化式を何度か確認しましたがなぜか1から順に進まず飛び飛びで進みます。
どういった書き方をすれば上のようにうまくいくでしょうか。
また初期化式の変数がよくわからない数字になるのはこれはどういった仕組みなのでしょうか。教えていただければ幸いです。
またコードの書き方に関しても初心者なので}が見やすくなる方法なども教えていただけると助かります。

該当のソースコード

function myFunction() {
const ss1 = SpreadsheetApp.openById("");
const shrelay = ss1.getSheetByName('');

var p = shrelay.getRange(2,1,10,3).getValues();

const shmain = ss1.getSheetByName('集計表');
var o = ["Aさん","Bさん","Cさん","Dさん","Eさん","Fさん","Gさん","Hさん","Iさん","Jさん"]
var aa = bb = cc = ee = ff = gg = hh = ii = jj = kk = 0;
var stsarry = [aa,bb,cc,ee,ff,gg,hh,ii,jj,kk,ll,mm,nn,oo,pp,qq,rr,ss,tt]

for (var b = 0; b < 18; b++){
for (var i = 0; i < 35; i++){

if (p[i][1] == o[q]){

stsarry[q] = stsarry[q] + 1;

} } } } }

試したこと

ここに問題に対して試したことを記載してください。

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

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

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

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

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

macaron_xxx

2021/03/28 23:14

何を言っているのか全く理解できませんし、コードも理解不能です。 変数qが急にでてきていますし、何がしたいのか全く意味不明です。
macaron_xxx

2021/03/28 23:16

とりあえず少なくともどういうスプレッドシートの状態のときに、集計結果の最終出力スプレッドシートにどう出てほしいのか提示してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問