r, ifttt, line, research,

【R Notify】RからGoogleフォームに回答を送ってGoogleシートに記録してIFTTT経由でLINE Notifyに通知を送る

Shoya Shoya Follow May 08, 2020 · 19 mins read
【R Notify】RからGoogleフォームに回答を送ってGoogleシートに記録してIFTTT経由でLINE Notifyに通知を送る
Share this

Rの計算が長くかかるときに、終わったときに通知してほしいよね。

最近の大規模な計算に時間がかかっていて(出力が大きいからいったん保存して読み込んだりしてるせい)、その間の時間を有効に別のことに使いたいけど、計算が終わったらすぐ結果が見たい。

通知を送る先はなんとなくLINEにしよう。

PCのプッシュ通知に出す方法もあるらしいけど手元にあるiPhoneの方がいい気がする。

💮Rで通知 - cucumber flesh

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はダメ。

ただbodyencodeの書き方がわからない。

urlがあっていれば、回答自体は送ることができるものの、bodyencodeの書き方が間違っている場合「無回答」となってしまう。

Googleスプレッドシートに回答したこと自体は記録されて、新しく行が追加されるので、IFTTT経由で通知を送ること自体はできるが、せっかくなのでちゃんと回答を送信したい。

stack overflowさまさまで、フォームの送信に関するbodyの書き方を教えてくれた。

api - POST request with R and x-www-form-urlencoded fails encoding Payload - Stack Overflow

body部分はlist()”entry.回答箇所の数字” = “回答”encodeencode = “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」で検索して、マウスをホバーして対応をチェックしてコピーするという流れ。詳細は上の記事を参照。

これで無事、回答を送信することができた。

ちなみに、回答を「必須」にしてしまうと、bodyencodeが間違っていたときに回答の送信すらできないので注意。

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で繋がってくれたら楽。

Shoya
Written by Shoya Follow
免疫学やウイルス学について数理モデルを使った研究をしています。