定例の通知を出すフローなどで定型文が続くと、味気ない感じがしたので、絵文字をランダムで変更して表示してみることにしてみた際のメモ書きです。
方法を考える
条件
まずは、条件です。
こんな風に出来たらいいなぁというのをおぼろげながら書き出します。
- 1日3回、「8:00、13:00、21:00 」にトリガーされる
- 投稿時間は様子をみて変更する可能性がある(優先順位は低い)
- 絵文字はランダムで変わる
- 1日のうちで絵文字はかぶらないようにする
どうやったら実現できるか
1日3回、「8:00、13:00、21:00 」に投稿されるので、時計だと1から12で表現できる(12進数)ので、12を3つのグループに分けて、グループごとに絵文字がかぶらないように配置すればでできそうです。 やり方はいろいろありそうですが、今回は下記の方法でやってみます。
実装していく
1つずつ実装していきます。
トリガーの設定
まずは、トリガーを設定しましょう。 1日3回、「8:00、13:00、21:00 」 に設定します。
フロー実行時刻から、12進数で取り出す
今回、12進数でグループ分けするので、21:00は9:00として、hour(時)の部分だけ取得でします。 タイムスタンプは文字列なので整数にするのも忘れてはいけません。
変数を初期化する アクションで作成します。
名前
number by hour
種類
整数
値
int(convertTimeZone(utcnow(),'UTC','Tokyo Standard Time','hh'))
グループを計算する
div 関数は割り算(除算)の関数です。
一般的な算数の割り算と違い、引数の当て方によって、Integer型(整数)かfloat型(浮動小数点数。説明の便宜上小数だと思ってください)かが変わります。
例えば、算数での割り算は10÷3だと割り切れないので、3.3333333....という結果になります。
しかし、divの場合は、下記のようになります。
式 | 実行結果 | 型 |
---|---|---|
div(10,3) | 3 | Integer |
div(10,0.3) | 3.3333333333333335 | float |
div(10.0,3) | 3.3333333333333335 | float |
引数に小数が入っている(10.0のような表記でも良い)場合、float型として扱われ、引数が整数のみだと、計算結果の整数部分のみ取得され、小数以下は切り捨てになります。(四則演算の関数は、おそらくどれも同様の動作)
この性質を利用して、グループ分けを計算して求めます。
グループを0,1,2の3つに分けます、
グループ 0 は、1時~4時、13時から16時の場合のグループです。
今回1から12までの12個の数字を3つのグループに分けるので、12 ÷ 4 すれば、3つに分かれますね。
下記の表のように、 (number by hour - 1) ÷4 の結果の小数以下を切り捨てられれば、綺麗にグループ分けできそうです。
number by hour | number by hour ÷ 4 | number by hour -1 | (number by hour - 1) ÷4 |
---|---|---|---|
1 | 0.25 | 0 | 0 |
2 | 0.5 | 1 | 0.25 |
3 | 0.75 | 2 | 0.5 |
4 | 1 | 3 | 0.75 |
5 | 1.25 | 4 | 1 |
6 | 1.5 | 5 | 1.25 |
7 | 1.75 | 6 | 1.5 |
8 | 2 | 7 | 1.75 |
9 | 2.25 | 8 | 2 |
10 | 2.5 | 9 | 2.15 |
11 | 2.75 | 10 | 2.5 |
12 | 3 | 11 | 2.75 |
変数を初期化する アクションで作成してみます。
名前
group select
種類
整数
値
div(sub(variables('number by hour'),1),4)
実行結果を確認すると下表のようになります。
div 関数の引数に小数が入っていないので、小数以下は切り捨てになります。
これで実行した際の時間ごとにグループが選択できそうですね。
number by hour | sub(variables('senumber by hour'),1) | div(sub(variables('number by hour'),1),4) |
---|---|---|
1 | 0 | 0 |
2 | 1 | 0 |
3 | 2 | 0 |
4 | 3 | 0 |
5 | 4 | 1 |
6 | 5 | 1 |
7 | 6 | 1 |
8 | 7 | 1 |
9 | 8 | 2 |
10 | 9 | 2 |
11 | 10 | 2 |
12 | 11 | 2 |
グループごとに絵文字を準備する
arrayで配列データを準備します。
グループ間で絵文字がかぶらないように絵文字を準備します。
変数を初期化する アクションで作成します。
rand 関数は、指定した範囲のランダムな整数を取得できる関数です。rand(0,4) の場合、0~4の間になるのですが、最大値は除くという仕様なので、0~3のランダムな整数が取得できます。
「createArray('🐸','🐼','🦁','🦥')?[rand(0,4)]」と記載することで、実行時にランダムに1個選択されます。
それを3グループ分で3つ用意し、アレイ(配列)として格納します。
名前
emoji group
種類
アレイ
値
[ @{createArray('🐸','🐼','🦁','🦥')?[rand(0,4)]}, @{createArray('🦑','🐧','🧞','🐘')?[rand(0,4)]}, @{createArray('🍖','🐑','🍔','🤖')?[rand(0,4)]} ]
実行結果
絵文字を取得する
グループを0,1,2の整数で取得しているので、絵文字の配列をグループの番号で指定すれば、絵文字が取得できます。
作成 アクションで作成してみます。
入力
variables('emoji group')?[variables('group select')]
実行結果
なんとか、最初に考えた要件はこれでクリアできました。
* 1日3回、「8:00、13:00、21:00 」にトリガーされる
* 投稿時間は様子をみて変更する可能性がある(優先順位は低い)
* 絵文字はランダムで変わる
* 1日のうちで絵文字はかぶらないようにする
さいごに
想定と違った結果になっているなぁ、なんでだろうなぁと、div 関数の Integer型 と float型 には結構ハマりました。ちゃんとデータ型を意識しないといけないですね。
今回のほかにもいろんな方法があると思うので、いろいろ工夫すると面白そうです。