Rの計算が長くかかるときに、終わったときに通知してほしいよね。
最近の大規模な計算に時間がかかっていて(出力が大きいからいったん保存して読み込んだりしてるせい)、その間の時間を有効に別のことに使いたいけど、計算が終わったらすぐ結果が見たい。
通知を送る先はなんとなくLINEにしよう。
PCのプッシュ通知に出す方法もあるらしいけど手元にあるiPhoneの方がいい気がする。
RからLINEにダイレクトに通知を送るのはLINE Notifyでトークンを発行するとか面倒そうだったので、IFTTT経由で行くことにした。
R → Googleフォーム → Googleスプレッドシート → IFTTT → LINE rnotify
Googleフォーム → Googleスプレッドシートは、Googleフォームから1クリックで回答保存用のスプレッドシートが作れる。
Googleスプレッドシート → IFTTT → LINE rnotifyは、IFTTTでぽちぽちするだけ。
問題はR → Googleフォームくらい。
一応形にはなった。
IFTTTの連携先を変えればLINEじゃなくてもSlackとかにも送れます。
参考に具体的なRのスクリプトを載せておく。以下のコードのAwesome message!
の部分を変えてRで実行したら、私のLINE Notifyに通知とメッセージが飛びます!笑
> library("httr")
> url <- "https://docs.google.com/forms/d/e/1FAIpQLScvOdzXNlXzDOAOyEesPZ5rvSYankVaTkH7CFB9dYfCJjHodA/formResponse"
> form_data <- list("entry.1760406474" = “Awesome message!”)
> POST(url = url, body = form_data, encode = "form")
RからGoogleフォームに回答を送信する
package “googleformr”でできそうだったけど、手順通りにしても404エラーが返ってくる。
library(googleformr)
> form_id <- "https://docs.google.com/forms/u/0/d/e/xxxx"
> test <- googleformr::gformr(form_id)
open.connection(x, "rb") でエラー: HTTP error 404.
> test("test")
steventsimpson/googleformr: README.md
package “httr” のPOST() functionでできそうな気がするので、やってみる。
POST function | R Documentation
> POST(url = NULL, config = list(), ..., body = NULL,
+ encode = c("multipart", "form", "json", "raw"), handle = NULL)
url
はフォームのURL/formResponseでOK。短縮URLはダメ。
ただbody
とencode
の書き方がわからない。
url
があっていれば、回答自体は送ることができるものの、body
とencode
の書き方が間違っている場合「無回答」となってしまう。
Googleスプレッドシートに回答したこと自体は記録されて、新しく行が追加されるので、IFTTT経由で通知を送ること自体はできるが、せっかくなのでちゃんと回答を送信したい。
stack overflowさまさまで、フォームの送信に関するbody
の書き方を教えてくれた。
api - POST request with R and x-www-form-urlencoded fails encoding Payload - Stack Overflow
body
部分はlist()
で”entry.回答箇所の数字” = “回答”
、encode
はencode = “form”
とすればいいっぽい。
> library("httr")
> url <- "https://docs.google.com/forms/u/0/d/e/xxx/formResponse"
> form_data <- list("entry.xxx" = "message")
> POST(url = url, body = form_data, encode = "form")
”entry.回答箇所の数字” = “回答”
の部分は、Googleフォームをカスタマイズする人の記事を参考にヒントを得た。
Googleフォームを自在にカスタマイズする - Qiita
フォームをプレビューして、ブラウザで開発モード的なのでソースコードを見て「entry」で検索して、マウスをホバーして対応をチェックしてコピーするという流れ。詳細は上の記事を参照。
これで無事、回答を送信することができた。
ちなみに、回答を「必須」にしてしまうと、body
やencode
が間違っていたときに回答の送信すらできないので注意。
GoogleスプレッドシートからIFTTT経由でLINE Notify
IFTTT経由するとトークンの管理とかしなくていいから楽。
IFTTTで”This”の部分でスプレッドシートを選択し、”New row added to spreadsheet”を選ぶ。
“Or copy and paste the spreadsheet URL”に回答記録用のスプレッドシートのURLをペースト。
“That” にはLINEを選択し、”Send message”。
特別通知を送りたいグループなどがなければ、”1-on-1 chat with LINE Notify”を選ぶ。
Messageは自由にカスタマイズ。
今回はcolumn BにRからの文字列が記録されるので適当に”Message”を設定した。
R Notify<br>
Time: <br>
<br>
<br>
<br>
Created <br>
View Google Sheet
まとめ
間違ってフォームのURLを公開してしまったら知らない人が回答しても通知が来てしまうけど、その時はフォームで回答を受け付けないようにしたりしたらいいかな。
トークンの管理よりははるかに安全な予感。
全部がIFTTTで繋がってくれたら楽。