paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

Appsheetから麻雀の集計スコアをLINEにPOSTする

以前Appsheetで麻雀スコアのタンキングのアプリを作りましたが、一緒に対局する人が変わればお作法も変わるもので一局終了するたびに最終スコアを運営者にLINEで送るという対応をすることがあります。

まあ電卓や暗算で計算して送ればいい話なのですが、素点を入力したら点数を計算して通知までできたら簡単ですよね。

以前のタンキングツールもAppsheetで出来たし、今回も似たものを作ってLINEへの通知をすればいいやということでAppsheetで作ることにしました。

得点の計算処理自体は難しくないので自分でAndroidアプリとして作ろうかなとも思いましたが結果1日でできたのでAppsheetを選択してよかったと思います。

処理の流れ

  1. Appsheetに4人分の素点を入力
  2. Appsheet内で得点を計算(返し、ウマ、オカ)
  3. 4人分のスコア結果をLINEへ送信

整理するほど大層なものではないですが処理の流れはこんな感じです。

LINE側の処理

POSTを受け付けられる準備をします。

  • LINE Bussiness IDを取得
  • 公式LINEを作成
    • Messaging APIのチャネル作成

これだけ。
LINEへの通知方法はNotifyとかありましたが今はMessaging APIしかサービスがない様です。

アカウント開設の記事はたくさんあるので割愛します。
とりあえず自分の公式LINEアカウントが出来ましたw

Appsheetの処理

構成をメモしておきます。

view

  • テーブル型。なんでもよかったんですが一番スコアが見やすかったので。

data

スコアをいじる部分です。
今回はタンキングせずに計算ツールとして4人分のスコアを都度Updateして回すことにします。

少し不要なカラムもありますが。テーブル構成は以下です。

4人分の素点から最終スコアを計算。rawscoreを入れると以下4つの仮想列が計算されます。 各計算式はGeminiと一緒に考えました。

  • rank

素点順に順位づけ。

COUNT( SELECT( tbl_point[rawscore], [rawscore] > [_THISROW].[rawscore])) + 1

順位によってウマが割り振られます。

SWITCH([rank], 1, 20.0, 2, 10.0, 3, -10.0, 4, -20.0, 0.0)
  • oka

1位にはオカが付きます。3人計算の残りでもよかったのですが、こちらのカラムを作った方が楽でした。

IF([rank] = 1, 20.0, 0.0) 
  • finalscore

30000点返しにウマとオカを加えて最終スコアを出します。

([rawscore] - 30.0) + [uma] + [oka]

automation

自動通知の処理。
イベントとプロセスを決めます。

event
  • Add row時に発動
  • 4人分のスコア更新後にLINEへ通知するためこれが一番良かった
process
  • Url: Messaging APIのURLを指定。
https://api.line.me/v2/bot/message/broadcast
  • HTTP Content-Type: JSON
  • Body: SELECTでテーブルをループして4人分の最終スコアを取得
{
    "messages": [
   {
    "type": "text",
    "text": "
      <<Start: SELECT(tbl_point[Row ID], [rank] <= 4 )>>
      <<[player]>> <<[finalscore]>>\n
      <<End>>"
    }]
}
  • HTTP Header
    Autorization: "Bearer xxxxxxxxxx" (APIチャネル作成時に発行されるトークンを指定)

動かしてみる

automationのTESTでLINEへの通知までできましたのでスマホから実際に動かしてみます。
PlayerA-Dまでの素点を入力。ウマとオカのカラムは非表示していますがFinalscoreまで自動計算されます。
Player以外は過去のテストで使ったレコードです。

キャプチャ上切ってしまいましたが下部の「+」ボタンで新しい行を追加すると1位から4位までのスコアがLINEに通知されます。

以下のような記載をして追加します。

通知処理の関係で新しい行はー100など絶対に全体で5位以下になる入力にしないといけません。 仕様上仕方ないけどレコード追加なしにPOSTできるように直したい。

新しいsubmitのレコードが追加されました。

回線状況によりますが数十秒~1分ほどで自分の公式LINEに通知が届きました。 Appsheetのコマンドでループさせてるからか、カンマが入っちゃってます。これも直したい。

100%までは出来ませんでしたが素点入力からここまで持ってこれればひとまずは楽になりそうですね。

詰まったところ

  • HTTP headerのContent-Type

ヘッダにAutorizationのほか、Content-type: application/JSONを記載していたのですが、パラメータ重複エラーが出ました。
automationの設定項目に元々HTTP Content-Typeのパラメータが個別にあり、ここで自動で指定されるようです。

  • body

詰まるというかJSONの構造の入れ子でいろいろ凡ミスしてパースエラーになりました。ミスの過程は書いても仕方ないので割愛しますが備忘として残しておきます。

まとめ

自作ツールからLINEへの通知というのはずっとやってみたかったのですが今回の形でやっと実現できました。
やりたかったといっても通知したいものが意外と今まで無かったなっていう…。

本ツールはしばらく麻雀会でも使ってみますが、直したいところもあるので作り直すかもしれません。
しかしAppsheetは簡単でいいですね。
本執筆は置いておいて、Appsheet入力からのLINE連携は1日で作れたのですぐ動くもの欲しいときにお勧めです。