FRepでの送信ログ作成には、大きく分けて2つのことが必要です。
■Frepの変数を使い送信ログを作成してクリップボードに文字列を設定する。
→プログラム【送信ログ作成】文字列作成(こちらの記事です)
■ハングアウト等のメッセージアプリに出力する。
→プログラム【送信ログ出力】Google Chatに出力
→ プログラム【送信ログ出力】ハングアウトに出力(ハングアウトは2021年後半に終了予定)
Taskerを使用してログ作成も出来るらしいですが、当記事ではFRepのみで文字列を作成する方法を解説します。変数の基本についてはこちら、又は公式FRepサポート変数リファレンスをご覧ください。
文字列と数値
多くのプログラミング言語と同様にFRepも文字列と数値を区別して取り扱います。
Excelを使ったことのある方でしたら、文字列と数値の違いがなんとなくわかるのではないかと思います。送信ログの作成では【数値から文字列への変換】を多用しますので、まずはその違いを理解しましょう。
FRepの変数には【(空)】【数値=num】【矩形=rect】【文字列=str】の4つの型があり、変数の演算文を作成する際にその型を指定します。
公式FRepサポートの変数リファレンスによると次の様に説明されています。
つまり
【数値】は 整数、小数、負数です。四則計算(←重要!)が出来ます。
【文字列】は文字の集まりです。[”(ダブルクォーテーション)]で囲まれています。
全角文字を入力すると自動的に””で囲まれますが、半角の英数字の場合は変数や数値と区別がつかない為、自分で””で囲みます。規定通りの演算文になっていないとエラーになり、作成したはずの変数が適用にならないこともあります。
例えば
数値
var1=num:123
var2=num:456
var=num:var1+var2
varの値は579.0(数値・小数点第一位まで)になります。
文字列
var1=str:”123″
var2=str:”456″
var=str:var1+var2
varの値は123456(文字列)になります。
データの作成
プログラムの中で、自分が送信ログに欲しいと思うデータを作り変数にセットします。
カウントや時間のデータは四則計算をしたいので数値として扱います。
各種回数カウント
■ハートを送信した回数[Hcnt]
■再送信でリカバリした回数[Rcnt]
■エラーループでループした回数[Ecnt]
その他いろいろな回数カウントのデータは、変数を使って作成します。
(1)カウント前に[Hcnt=num:0]を宣言する
(2)カウント位置で[Hcnt=num:Hcnt+1]する
具体的にカウント(+1)するプログラム位置については、【高速ハート送信Hv2】を参考にしてください。
ハート送信
ハートをタップ直後に[Hcnt=num:Hcnt+1]
但し、ミキピョン等により複数回カウントされる可能性もあります。【高速ハート送信Hv2】の場合は1位近辺で1つ多くカウントされやすいです。
再送信
再確認でのハートをタップ直後に[Rcnt=num:Rcnt+1]
ハートのカウントと同じ様に複数回カウントの可能性もあります。
エラー
■エラーループ内に[Ecnt=num:Ecnt+1]:1回のエラー処理時に3回ループしたら3回カウント
■エラーループの直前に[Ecnt=num:Ecnt+1]:エラー1回につき1回をカウント
どちらが良いのかは個人の好みです。
いずれにしても何をカウントしたデータなのかを自分で理解しておきましょう。
時刻と時間
プログラム開始時刻
システム変数@startを使用します。
送信開始時刻
送信関数のプログラム1に変数[stm=num:@now]をセットします。
送信終了時刻
送信関数の終了直前に送信ログ作成変数を入れる場合は、その場でシステム変数@nowを使用します。
ボックス受取後など時間経過後に送信ログ作成する場合は、送信関数の終了直前に変数[etm=num:@now]としておきます。
送信時間
[送信時間(ms)=num:@now-stm]又は[=num:etm-stm]
平均送信時間
[1件当たりの平均送信時間(ms)=num:送信時間/Hcnt]
[1分当たりの平均送信回数=num:60000(ms)/1件当たりの平均送信時間(ms)]
※Hcntの回数が実際よりも増減すると値が変わります。
時間に関する変数について詳しくはこちらをご覧ください。
【送信ログ】作成プログラム
数値データを文字列データに変換して、自分の好みで自由なレイアウトの送信ログを作成します。
但し、最初から手の込んだものを作ろうとすると、1行分の変数をセットするだけでも結構複雑なので不具合があった時に却って手間が増えます。まずは簡単なプログラムから作ってみて、うまく動いたら次のステップにいくとミスを発見しやすくお勧めです。
プログラムがうまく動かなかった場合は、文字列のはずの変数が途中で数値指定になっていることが多いのでチェックしてみてください。
【送信ログ1】クリップボードに文字列設定
【送信ログ2】数値→文字列への変換と小数点
【送信ログ3】日付文字列と改行
【送信ログ4】時間文字列
【送信ログ5】文字列の抽出
【送信ログ6】複雑な送信ログ(例)
【送信ログ1】1.2.及び【送信ログ2~6】3.4.のプログラムは、【ツムツム起動v5.2】【高速ハート送信Hv2】プログラムの最後尾に、【記録を追加】を利用してコピーすると便利です。
自分好みの送信ログを作成したら、動くことを確認してから送信プログラムにコピーしましょう。
【送信ログ1】クリップボード
変数logに文字列をセットしてクリップボードに出力するプログラムを作ります。
クリップボードに設定できるのは文字列だけです。変数で指定した場合は引数(値)が文字列か数値なのか区別がつかない為に表面上はエラーになりませんが、引数(値)が数値の場合は実行してもクリップボードは空になります。
任意のアプリに長押し→貼付で「起動3回エラー!!」と貼り付けできたら成功です。
プログラム1.2を【ツムツム起動v5.2】プログラムの【中断】の直前に入れて使用する事もできます。
プログラム
プログラムの説明
1.[変数]-[log=str:”起動3回エラー!!”]
変数logに文字列「起動3回エラー!!」をセットします。
2.[クリップボード]-変数logをセット
▼をタップして変数をセットします。
【送信ログ2】数値→文字列
疑似カウントした数値を文字列に変換します。
カウントや計算をする際には数値にする必要がありますが、クリップボードに張り付ける為には文字列でなくてはいけません。【変数の特殊参照】によって数値を文字列に変換することが出来ます。
【.asstr】[変数=str:var.asstr]で数値をそのまま文字列に変換
【.asdate】[変数=str:var.asdate]で日付文字列(yyyy/MM/dd kk:mm:ss)
【.astime】[変数=str:var.astime]で時間文字列(hour:min:sec.ms)
詳しくはFRepの時間に関する解説をご覧ください。
尚、変数で四則計算をした際に値が整数の場合、その値は小数点第一位までになる様です。つまり1+1の値は【2.0】になります。なので、疑似カウントデータも小数点第一位までとしました。値が整数ではない場合は小数点第16位まで確認しました。
プログラム
プログラムの説明
1.[変数]-(疑似)データ作成
■[stm=num:@now]-プログラム実行時刻(送信開始時刻)を変数stmにセットします。
【@now】は▼から【現在時刻(ms)】を指定すると入力されます。
■疑似カウントデータ作成
本来はカウント前に[Hcnt=num:0]を宣言し、カウント位置で[Hcnt=num:Hcnt+1]しますが、ここでは疑似データをセットしておきます。
[Hcnt=num:10.0]
[Rcnt=num:0]
[Ecnt=num:2.0]
2.[待機]5秒-(疑似)送信実行時間
プログラム1から送信実行時間代わりの[待機]なので本来は不要です。
3.[変数]-送信ログ作成
[log=str:”送信数:”+Hcnt.asstr]
【送信数:】と【Hcnt.asstr】は自分で入力します。ピリオドを忘れない様にしてください。
4.[クリップボード]-変数logをセット
【送信ログ1】参照
【送信ログ3】日付文字列と改行
2019/03/20 11:22:38
送信数:10.0
1行目:送信開始時刻
2行目:送信終了時刻
3行目:送信数
時刻は【.asdate】で日付文字列(yyyy/MM/dd kk:mm:ss)の形式で出力します。詳しくはFRepの時間に関する解説をご覧ください。
文字列に改行を入れたい場合は【\n】=【”\(半角バックスラッシュ)n”】を使います。公式FRepサポートの変数リファレンス参照。
お使いのPCや端末のフォントによってはバックスラッシュではなく”\”で表示されるかもしれませんが、FRep変数には【半角バックスラッシュ】と【n】を入力してみてください。
半角バックスラッシュは記号から探すか「すらっしゅ」で変換できる場合もある様です。
プログラム
プログラム1.2.4は【送信ログ2】と同じです。
プログラム3の説明
3.[変数]-送信ログ作成
1.[log=str:stm.asdate + “\n”]-文字列化と改行
2.[log2=str:@now.asdate + “\n”]-文字列化と改行
3.[log=str:log + log2]-文字列の結合
4.[log=str:”送信数:”+Hcnt.asstr]-文字列化
5.[log=str:log + log2]-文字列の結合
【送信ログ4】時間文字列
2019/03/20 11:22:38
00:00:05:012 * 501.2
10.0H * 0R * 2.0E
1行目:送信開始時刻
2行目:送信終了時刻
3行目:送信時間 *平均送信時間(ms)
4行目:各カウント数
時間は【.astime】で時間文字列(hour:min:sec.ms)の形式で出力します。詳しくはFRepの時間に関する解説をご覧ください。
平均送信時間は[1件当たりの平均送信時間(ms)=num:送信時間/Hcnt]で算出します。もしもHcntが【0】の場合はFRepの定義(引数2が0の場合は引数1の値を返す)により送信時間が出力されます。
プログラム
プログラム1.2.4は【送信ログ2】と同じです。
プログラム3の説明
3.[変数]-送信ログ作成
1.[log=str:stm.asdate + “\n”]-変数log:【2019/03/20 11:22:33[改行]】
2.[log2=str:@now.asdate + “\n”]-変数log2:【2019/03/20 11:22:38[改行]】
3.[log=str:log + log2]-変数log:【2019/03/20 11:22:33[改行]2019/03/20 11:22:38[改行]】
4.[stm=num:@now-stm]-送信時間の計算
5.[log2=str:stm.astime + ” * “]-変数log2:【00:00:05:012 * 】
6.[log=str:log + log2]-変数log:【2019/03/20 11:22:33[改行]2019/03/20 11:22:38[改行]00:00:05:012 * 】
7.[stm=num:stm / Hcnt]-1件当たりの平均送信時間(ms)
8.[log2=str:stm.asstr + “\n”]-変数log2:【501.2[改行]】
9.[log=str:log + log2]-変数log:【2019/03/20 11:22:33[改行]2019/03/20 11:22:38[改行]00:00:05:012 * 501.2[改行]】
10.[log2=str:Hcnt.asstr + “H * “]-変数log2:【10.0H * 】
11.[log=str:log + log2]-変数log:【2019/03/20 11:22:33[改行]2019/03/20 11:22:38[改行]00:00:05:012 * 501.2[改行]10.0H * 】
12.[log2=str:Rcnt.asstr + “R * “]-変数log2:【0R * 】
13.[log=str:log + log2]-変数log:【2019/03/20 11:22:33[改行]2019/03/20 11:22:38[改行]00:00:05:012 * 501.2[改行]10.0H * 0R * 】
14.[log=str:log + Ecnt.asstr]-変数log:【2019/03/20 11:22:33[改行]2019/03/20 11:22:38[改行]00:00:05:012 * 501.2[改行]10.0H * 0R * 2.0】
15.[log=str:log + ”E”]-変数log:【2019/03/20 11:22:33[改行]2019/03/20 11:22:38[改行]00:00:05:012 * 501.2[改行]10.0H * 0R * 2.0E】
【送信ログ5】文字列の抽出
プログラム開始時刻 * 送信時間 * 送信数
【送信ログ4】の様に情報量が多過ぎる場合に、文字列の演算子に【sub】を使うことによって文字列の抽出が可能です。文字列の中から必要な部分のみを切り取って使用することでスッキリした送信ログを作成します。
公式FRepサポートの変数リファレンスによる文字列の演算子【sub】の説明です。
なかなか難しいです。筆者は最初理解できず具体的な使い方を本職プログラマーHさんに教えて頂きました。同じ様に難しいと思う方は、あまり考えずに真似しちゃいましょう!
var=str:var sub (la ln ca cn)
subの引数2は4つの値(la ln ca cn)によって出来ています。簡単に書くと…
1.la:何番目の行から
2.ln:何行分
3.ca:何番目の文字から(左から0.1.2..と数える)
4.cn:何文字分
行も設定すると更に大変なので1と2は無視して3.caと4.cnだけを使います。
例1:【ABCDE】という文字列の中から【CD】だけを抽出したい場合
【ABCDE】を左から数えると…
【01234】なので、【C】は【2】=[ca:2]
【CD】は2文字なので[cn:2]
[var=str:”ABCDE” sub (0 0 2 2)]→varの値は【CD】
例2:【2019/03/20 11:22:33】という文字列の中から時刻の【11:22:33】だけを抽出したい場合
【2019/03/20 11:22:33】を左から数えると…※[スペース]も1文字として数えます。【0123456789012345678】なので、時刻の最初は[ca:11]
【11:22:33】は8文字なので[cn:8]
日付文字列(yyyy/MM/dd kk:mm:ss)のうち【kk:mm:ss】のみ抽出は
[変数=str:var.asdate sub (0 0 11 8)]
例3:
時間文字列(hour:min:sec.ms)のうち【min:sec】のみ抽出は
[変数=str:var.astime sub (0 0 3 5)]
プログラム
プログラム1.2.4は【送信ログ2】と同じです。
プログラム3の説明
3.[変数]-送信ログ作成
1.[log=str:@start.asdate sub (0 0 11 8)]-変数log:【11:22:33】
2.[log=str:log +” * ”]-変数log:【11:22:33 * 】
3.[stm=num:@now-stm]-送信時間の計算
4.[log2=str:stm.astime sub (0 0 3 5)]-変数log2:【00:05】
5.[log=str:log + log2]-変数log:【11:22:33 * 00:05】
6.[log2=str:” * H” + Hcnt.asstr]-変数log2:【 * H10.0】
7.[log=str:log + log2]-変数log:【11:22:33 * 00:05 * H10.0】
【送信ログ6】複雑な送信ログ(例)
11:22:33 * H10.0 * R0 * E2.0
1行目:プログラム開始時刻 * 送信時間 *平均送信時間(秒)
2行目:送信開始時刻 * 各カウント数
【送信ログ1~6】を踏まえての送信ログ(例)です。
プログラム
プログラム1.2.4は【送信ログ2】と同じです。
プログラム3の説明
3.[変数]-送信ログ作成
1.[log=str:@start.asdate sub (0 0 11 8)]-変数log:【11:22:33】
2.[log=str:log +” * ”]-変数log:【11:22:33 * 】
3.[log3=str:stm.asdate sub (0 0 11 8)]-変数log3:【11:22:33】
4.[stm=num:@now-stm]-送信時間の計算
5.[log2=str:stm.astime sub (0 0 3 5)]-変数log2:【00:05】
6.[log=str:log + log2]-変数log:【11:22:33 * 00:05】
7.[log=str:log + ” * avg.”]-変数log:【11:22:33 * 00:05 * avg.】
8.[stm=num:stm / Hcnt]-1件当たりの平均送信時間(ms)
9.[stm=num:stm / 1000]-1件当たりの平均送信時間(秒)
10.[log2=str:stm.asstr sub (0 0 0 4)]-変数log2:【0.50】
11.[log=str:log + log2]-変数log:【11:22:33 * 00:05 * avg.0.50】
12.[log=str:log + “\n”]-変数log:【11:22:33 * 00:05 * avg.0.50[改行]】
13.[log=str:log + log3]-変数log:【11:22:33 * 00:05 * avg.0.50[改行]11:22:33】
14.[log2=str:” * H” + Hcnt.asstr]-変数log2:【 * H10.0】
15.[log=str:log + log2]-変数log:【11:22:33 * 00:05 * avg.0.50[改行]11:22:33 * H10.0】
16.[log2=str:” * R” + Rcnt.asstr]-変数log2:【 * R0】
17.[log=str:log + log2]-変数log:【11:22:33 * 00:05 * avg.0.50[改行]11:22:33 * H10.0 * R0】
18.[log2=str:” * E” + Ecnt.asstr]-変数log2:【 * E2.0】
19.[log=str:log + log2]-変数log:【11:22:33 * 00:05 * avg.0.50[改行]11:22:33 * H10.0 * R0 * E2.0】
まとめ
以上で送信ログの完成です。
少し複雑かもしれませんが、一度作成してしまえば毎日の送信管理が楽にそして確実になります。
トラブルがあった場合も送信数やエラーの回数で何があったのか推察しやすいでしょう。
Google Chat 等のメッセージアプリへの出力はこちらをご覧ください。
コメント
何もプログラムを触っていないのに
急に送信ログがハングアウトに送信されなくなりました
クリップボードを空にしてみる→送信なし
クリップボードに(テスト)と入れてみる→(テスト)が送信される
↑から、送信ログがクリップボードに入っていない?とおもってクリップボードにlogを書き込む所を入れ直してみました(内容は変更してません)がやはり送信されませんでした
他にやってみると良いことがあれば
教えてください
送信ログを作成中の変数がおかしくなっているのかもしれませんね。
変数1つでも計算式が成り立たなかったり最終的に文字列になっていなかったりするとクリップボードに出力できませんので。
原因を突き止めるには、ひとつひとつプログラムを確認するしかなさそうです。
★ログ作成部分を切り取って、その部分のみ1つずつ動かしてみる
★逆に、全く新しい送信ログ作成プログラムを作って、きちんと動く事を確認してから既存プログラムにコピペしてみる
思いつくのはこんな感じです。
頑張ってください。
かのんさま
回答ありがとうございます
時間を作って、試してみます
ログ作成部分の関数を
入れ替えて試してみるのが早そうですね(*^^*)