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

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

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

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

JavaScript

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

Q&A

解決済

2回答

987閲覧

for文を使用したデータの格納方法

purikirara

総合スコア3

Google Apps Script

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

JavaScript

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

0グッド

0クリップ

投稿2021/04/15 09:40

前提・実現したいこと

gas初心者です。
出退勤管理ツールをGAS(Java script)で作成しています。

A列に出退勤日
B列に出退勤時間
C列にユーザ名

A列B列C列
2021/3/410:00Aさん
2021/3/510:00Aさん
2021/3/610:00Aさん
2021/3/410:00Bさん
2021/3/510:00Bさん
2021/3/610:00Bさん
2021/3/310:00Cさん

以上のデータがスプレッドシートに出力されています。

同じユーザで日付データを配列に格納しようと考えています。
userData1 = Aさんの出退勤日
userData2 = Bさんの出退勤日
userData3 = Cさんの出退勤日

for文とif文を使用して配列に入れようと考えていますが、一人分のデータしか取得ができません。
for文で変数を動的に指定する方法に苦戦しています。
どなたかお力添えいただけませんでしょうか。

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

userdata[i]

該当のソースコード

GAS

1function myFunction() { 2 3//ユーザデータを配列に格納 4 let duplicateUserList = SHEET. getRange( 1, 3, SHEET. getLastRow()). getValues(). flat(); 5 let userList = Array. from( new Set(duplicateUserList)); 6 7 8//1人目はif文で一致したデータをusedataに格納できる。 9//2人目移行をどのように指定すべきでしょうか。(とりあえずbreakにしている) 10 11 let attendanceDataList = SHEET.getRange( 1, 1, SHEET.getLastRow(), 3).getValues(); 12 let userdata1 = [] 13 for( let i = 0; i < userList.length; i++){ 14 for (let ii = 0; ii <= attendanceDataList.length; ii++){ 15 if( userList[i] == attendanceDataList[ii][2]){ 16 userdata1.push(attendanceDataList[ii][0]) 17 }else{ 18 break; 19 } 20  } 21 } 22}

試したこと

eval("var workdaysForEachUser_" + i + "= [] ;");
上記文を1回目のfor文に追加を試みましたが、ifでどのように指定すべきか分かりませんでした。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

変数を動的に指定するという考え方を一回忘れましょう

結構コード書けているようなのでヒントになるようなuserdataの例をいくつか出します
どちらのやり方でもいいですかこれならif文で分岐できませんか?

js

1userdata = [["2021/3/4","2021/3/5" ....],["2021/3/5","2021/3/6" ....],["2021/3/3"]] 2 3userdata[0] // Aさん 4userdata[1] // Bさん

js

1userdata = {A:["2021/3/4","2021/3/5"],B:["2021/3/5","2021/3/6"]} 2userdata.A // Aさん 3userdata.B // Bさん

投稿2021/04/15 10:38

mouse_484

総合スコア759

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

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

purikirara

2021/04/15 13:26

ご返答ありがとうございます。 1の方法で対応したいと考えたのですが、データをpushする方法が分からず…。 ヒントをいただけたら嬉しいです。以下の方法ではエラーでした。 // i番目の人の日付データを(for1回目だったらAさん)userDataのi番目に配列格納する userdata[i].push(attendanceDataList[ii][0])
mouse_484

2021/04/16 00:58

userdata[i]が存在しないからだと思います なので存在するかどうか確認してなければpushなどで追加すればいいのではないでしょうか
guest

0

自己解決

検索方法の視点を変えてみました。for文で取得するのではなく、データの最初と最後のindexを検索して、indexを指定して列配列させました。
配列格納させる関数は、ユーザ毎に変更したかったので、evalを使用して解決させました。

当初よりも少しコードもすっきりさせることができました。
ご回答いただきありがとうございました。

java

1 2for( let i = 0; i < userList.length; i++){ 3 eval("var userData" + i + "= [] ;"); 4 let firstIndex = duplicateUserList.indexOf(userList[i])+1 5 let lastIndex = duplicateUserList.lastIndexOf(userList[i])+1 6 userData = SHEET.getRange(firstIndex,1,lastIndex-firstIndex+1).getValues().flat(); 7 eval("userData" + i + ".push(userData)"); 8 9 }

投稿2021/04/16 02:10

purikirara

総合スコア3

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

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

purikirara

2021/04/16 02:37

mouse484さんの方法で試してみました。 こちらのほうがシンプルに記述できました。 (ベストアンサーに変更したかったのですが、編集できず申し訳ございません) //user毎に日付データ格納 var userData = [] for( let i = 0; i < userList.length; i++){ let firstIndex = duplicateUserList.indexOf(userList[i])+1 let lastIndex = duplicateUserList.lastIndexOf(userList[i])+1 userData.push(SHEET.getRange(firstIndex,1,lastIndex-firstIndex+1).getValues()); }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問