🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Google スプレッドシート

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

Google Apps Script

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

JavaScript

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1116閲覧

[GAS][JS]トリガーを実行するたびに配列内の値を一つ使用してmessageをpostする

saider_san

総合スコア14

Google スプレッドシート

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

Google Apps Script

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

JavaScript

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/03/15 06:34

編集2021/03/15 06:39

何をしているか

ランダムで担当者を決めることができる抽選機能をGASで実装中です。
スプレッドシート上に以下のようにメンバーの情報を並べており(合計6名)

A列 テスト一郎 テスト二郎 テスト三郎 テスト四郎 テスト五郎 テスト六郎

ランダムな乱数配列を作成するところまでは成功したので、
トリガー(月〜金の時間指定)で実行する際に以下のようにランダムな乱数配列が作成できます。

1回目... [1.0, 2.0, 5.0, 6.0, 4.0, 3.0] 2回目... [6.0, 1.0, 3.0, 6.0, 5.0, 2.0]

この作成された乱数配列の先頭を使用し、メンバーの名前を取得して
現在のコードに記載の通りmessageをpostしているのですが
これだと作成される乱数配列は以下のような場合もあり重複してしまうことがあります。

// 1.0が被ってしまうのでテスト一郎が2連続担当者となる 1回目... [1.0, 2.0, 5.0, 6.0, 4.0, 3.0] 2回目... [1.0, 6.0, 3.0, 4.0, 5.0, 2.0]

現状のコード

現状のコード
(こちらを参考にさせていただきました。参考URL:https://pisuke-code.com/js-create-non-overlap-randoms/)
*スプシの取得などは除く

... /** 重複チェック用配列 */ var randoms = []; /** 最小値と最大値 */ var min = 1, max = 6; /** min以上max以下の整数値の乱数を返す */ function intRandom(min, max){ return Math.floor(Math.random() * (max - min + 1)) + min; } function TANTOU() { /** 重複チェックしながら乱数作成 */ for(i = min; i <= max; i++){ while(true){ var tmp = intRandom(min, max); if(!randoms.includes(tmp)){ randoms.push(tmp); break; } } } /** 乱数配列を使用 */ var row = randoms[0]; var Name = sheetdata[row][0]; var slackApp = SlackApp.create(slack["token"]); /** messageを送信するロジック */ var Message = slackApp.postMessage(slack["ChannelId"], "testtest" + "\n本日の担当者は…" + Name + "さんです!", {username : slack["userName"]}); Logger.log(Message); }

知りたいこと

現在は乱数配列の先頭のみをトリガーで実行するたびに使用しているのですが
実際には、トリガーで実行するたびに配列の先頭から順に
1回目はrandoms[0]、2回目にまたトリガーで実行されると次はrandoms[1]と取得し、

// 配列 randoms => [1.0, 2.0, 5.0, 6.0, 4.0, 3.0]だった場合 message1回目 本日の担当者は…テスト一郎さんです! //randoms[0] message2回目 本日の担当者は…テスト二郎さんです! //randoms[1] //次はテスト五郎が担当となる

その上で配列が空になれば、また新たに乱数配列を作成してまた先頭から順に...という実装にしたいのですが
どのようにすれば良いか手が詰まってしまい、
アドバイスなどご教示いただけますと幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

担当順をシャッフルしたいってことですよね?
前の質問に maisumakun さんが回答されているように、担当者のリストをシャッフルして結果をどこかに保存しておき、順番に取り出せばいいんじゃないでしょうか。

シャッフルは フィッシャー–イェーツのシャッフル 使えばいいかと思います。ググれば JavaScript で実装したサンプルも色々見つかります。

ただし6人全員を取り出した後(7日目以降)をどうするべきか考える必要があります。

投稿2021/03/17 09:08

draq

総合スコア2577

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

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

saider_san

2021/03/17 09:15

コメントありがとうございます! 担当者をシャッフルして、スプシに格納する形で やりたいことが実行でき、解決しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問