IFTTTを使ってAlexaとiruca(在席管理ツール)を連携してみた

**１．はじめに**
-
コロナ影響により1年以上リモートワーク生活となっています。皆さんも同じだと思いますが、リモートの場合は姿が見えないので在席か離席かをメンバー間で共有しなければならないですよね。私が所属するチームでは**[iruca](https://iruca.co/)**という在席管理ツールを利用しています。非常に簡単で扱いやすいツールなのですが、ステータス（在席 or 離席）更新を忘れてしまうことが多々あります。というのも、我が家には4歳、0歳の子供がおり、オムツチェンジ、ミルクなど、急に呼び出されるシーンが多く、急いで席を外すことが多くついつい更新を漏らしてしまうわけです。けっして開き直ってるわけではありません・・・:dizzy_face:
そんな事情もあり、手を使わずに更新できればいいのになーーと悶々としていたところ、ふと思い出しました。いつかのセールで半額だからという理由だけで勢いで買った**[EchoShow5](https://www.amazon.co.jp/Echo-Show-5-%E3%82%A8%E3%82%B3%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%BC5-%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E4%BB%98%E3%81%8D%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%82%B9%E3%83%94%E3%83%BC%E3%82%AB%E3%83%BC-with-Alexa-%E3%83%81%E3%83%A3%E3%82%B3%E3%83%BC%E3%83%AB/dp/B07KD87NCM)**があるじゃないかと。「もしや、**[Alexa](https://www.amazon.co.jp/meet-alexa/b?ie=UTF8&node=5485773051)**で更新できるんじゃないの？」と考え始めました。

**２．やってきたこと**
-
**＜１＞そもそもAlexaと他アプリの連携ってどうやるんだろう⇒IFTTTだ！**
まず最初にこの壁にぶつかりました。私、SEをやってますが言語はCOBOLしか触ったことがなく、違う言語やアプリといったものには全くと言っていいほど知識がないので、どうしようと。そんな時、たまたま今年度から社内の技術系コミュニティに参加していたので、そこで**[IFTTT](https://ifttt.com/)**というものを知りました。これはラッキー！と思い、早速IFTTTのことを調べてみました。

　**[IFTTT](https://ifttt.com/)**とは
　・「IF This Then That」の略。××したら●●する、ということ。
　・××は●●の起動条件で、わたしの場合は××がAlexa起動、●●がirucaスタータス更新。
　・対応しているのはAlexa、twitter、Line、Gmail・・・・

IFTTTを使えばアプリ間の連携ができるとのことで触り始めましたが、残念な結果が。Alexaは対応しているがirucaは対応していないことがわかりました:scream:

**＜２＞Alexa⇒IFTTTまではわかったけど、irucaにたどり着くにはどうすれば⇒スプレッドシート＆GASで連携だ！**
早速つまづいたので、前述したコミュニティで相談してみたところ、スプレッドシート＆GASを組み合わせればGASでirucaを呼び出せるはずというヒントをもらいました。確かに、IFTTTの対応しているアプリを見るとスプレッドシートがあったので、早速Alexa⇒IFTTT⇒スプレッドシートの連携に着手しました。

①まずはIFTTTでアプレットを1つ作ります。(以下画像はすでに作った状態です。無料で3つ作れます）
<img width="400" alt="IFTTT_TOP.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864256/b570b6da-a42c-5e44-bcea-103308c8c6f0.png">
②アプレットを作るため、IFとTHENを選びます。(以下画像はすでに作った状態です）
<img width="300" alt="IFTTT_IFTHEN.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864256/a147009d-8837-9a60-bd69-8da07cbdada7.png">
③IFにはAlexaを登録します。どんな言葉でAlexaを起動させるかを指定します。私は「スタート」にしました。（「アレクサ、スタートトリガー」と呼びかけると起動します）
<img width="300" alt="IFTTT_IF.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864256/39f32f3a-d6f9-a6af-665a-165c48ee2b80.png">
④THENにはスプレッドシートを設定しました。指定する内容は簡単で、スプレッドシート名、更新対象セル、更新時に設定する値（画像だと更新日時）を指定します。スプレッドシートは2パターン選択肢があり、行追加か行更新の2パターンです。わたしは行更新のパターンで作りました）
<img width="300" alt="IFTTT_THEN.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864256/c5f67c6a-15bc-d0ed-d867-981f4dde72da.png">

⑤④までを作り、Alexaに「アレクサ、スタートトリガー」と呼びかけると以下の通り指定したセルに更新日時が設定されます。
<img width="400" alt="Spread.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864256/34f22764-9336-f089-26fd-f27ce5719690.png">

次の問題。スプレッドシートに更新できるとこまで作れたものの、スプレッドシートが更新されたことをきっかけにしてどうやってGASを起動させ、irucaを呼び出せばいいのだろうかと悩み始めました。

**＜３＞GASからAPI呼び出すのはどうやればいいんだろう⇒とにかくTRY&ERROR！**
そもそもGAS自体がお初で、かつAPIってどうやって呼ぶんだ？から始まっているので相当苦戦しました。しかも、irucaのルームにあいことば（＝鍵）がかかっているのでトークンってものを投げないとダメということもあとでわかり、皆さんからすればチョロイものでも初心者のわたしには相当苦戦する戦いでした。かなり端折りますが、なんやかんや調べてTRY&ERRORを繰り返し、結果的に以下のソースになりました。ステータス更新の仕組みはかなりアナログで、取得したステータスが在席なら離席へ、離席なら在席へ更新するという簡単な仕組みです（これ以上考えても進まなそうだったので、ここで諦めました）　

```javascript:GAS
function irucaUpdate(){

//”あいことば”がないと入室できないのでAPIトークンをセット
var headers = {
  'X-Iruca-Token':'ここにはirucaのページに記載されているトークンを記載してください'
};

//UrlFetchのoptionsに、パラメータをセット。headersにAPIトークンをJSONでセットしている
var options = {
  'method' : 'GET',
  'headers':headers
};

//UrlFetchで参照APIを呼び出し（現在のステータスを取得するため）
var response = UrlFetchApp.fetch('https://iruca.co/api/rooms/ここにはirucaのページに記載されているroomコードを記載してください/members/ここにはirucaのページに記載されているmembersコードを記載してください',options);

//戻り値の中からstatusの値を確認するため、JSON.parseで取り出し
var jsonData = JSON.parse(response)
Logger.log(jsonData["status"]);

//statusに応じて、更新ステータスをセット
if (jsonData["status"] === "在席"){
  var data = {
  'status': '離席',
  }
}else{  
  var data = {
  'status': '在席',
  }
}  

//更新APIを呼び出し（スタータスを更新するため）
  var options = {
  'method' : 'put',
  'headers':headers,
  'payload' : data
};
  UrlFetchApp.fetch('https://iruca.co/api/rooms/ここにはirucaのページに記載されているroomコードを記載してください/members/ここにはirucaのページに記載されているmenbersコードを記載してください',options);
```
ソースは書いたけど、さてこのGASをスプレッドシートとどうやって連動させるんだ？が最後の課題となりました。

**＜４＞スプレッドシートが更新されたらGASを起動させるのはどうするんだろう⇒トリガーだ！**
ここは意外にあっさりと対応できました。トリガーをポチポチ指定するだけで良く、感覚で登録できました。スプレッドシートが変更時にトリガーが動くという指定にしています。
<img width="400" alt="Trigger.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864256/4d6a4be4-eb97-2314-e5a1-38ad3eccb9d8.png">

ここまでが作った仕組みです。
Alexaに呼びかけるだけでirucaのステータスが更新できるようになりました。

離席中が、
<img width="900" alt="iruca_riseki.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864256/878cb906-7542-c748-3b5b-e44a3dfc69f9.png">

在籍に変わります。
<img width="900" alt="iruca_zaiseki.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864256/a5889f94-ce0e-844e-38c0-d6971ad5f13d.png">

**３．さいごに**
作った仕組みの全体像は以下の通りです。泥臭い作りになってしまいましたが、初めてGASに触り、APIにも初めて触って課題をクリアできたのでそこそこ満足しています。今度はAlexaスキルを使って直接irucaを更新できる仕組みを作れないかなーと調べ始めたところです。進展あれば、また投稿します。
![Flow.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864256/2c13c16f-764e-a22a-0e74-982468fc9e28.png)

以上