LINEからスプレッドシートの値をちょっとスマートに変更する #withMake #LINEDC


Makeを使ってちょっとスマートにLINEからスプレッドシートの値を変更する仕組みを作ってみます。

> ![](https://i.gyazo.com/558cf67ac154d339c70ea020bd791079.png)

3章までは力技感ありますが、4章でちょっとスマートになります。

## 1. Makeを使ったオウム返しLINE Botを作る

まずは準備としてLINE Botを作ります。

https://qiita.com/watanabe-tsubasa/items/8342595d641143b780f7

こちらの記事の2章までを実施しましょう。

## 2. スプレッドシートを用意

スプレッドシートでこんな雰囲気の表を作ります。

> ![スクリーンショット 2024-06-20 20.37.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/abfae99c-f986-21c4-7bd7-c771b4cfdea0.png "スクリーンショット 2024-06-20 20.37.21.png")

コピペ用

```
device	value	last update
ColorLED	255,0,0	2024/6/20 18:00:00
Servo	40	2024/6/20 18:00:00
```

念の為今回は誰でも編集可能な状態にしてます。連携するときにGoogle認証使うので編集可にしなくてもOKだと思います。

> ![スクリーンショット 2024-06-20 20.36.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/792c3cf5-90fb-ff93-226d-a5a69dc02045.png "スクリーンショット 2024-06-20 20.36.50.png")

## 3. Makeで書き込みしてみる（とりあえずスマートではない版）

とりあえず書き込みをできるようにしてみます。

オウム返しLINE Botの`Watch Events`の右側にスプレッドシートの`Update a Rowモジュール`を繋げます。

> ![](https://i.gyazo.com/58986b7de0777608f82fdbc73e82e6c4.png)

初回繋げる時はGoogle認証が入ると思います。（今回はそこの操作説明は割愛）

先ほど作成したスプレッドシートのIDを探して、シート名を指定（何も変更してなければシート1）します。

以下を設定します。

- Row number: 3
- Table Contains headers: Yes
- Values:
	- decice(A): （空欄）
	- value(B): Events[].Message.Text (LINEモジュールからの変数)
	- last update(C): now（変数）

> ![](https://i.gyazo.com/ae3ba0fc72bbf2273fc71771377a548a.png)

Row numberは3行目という意味ですが、現状のシートで3行目はServoになり、 **スプレッドシートのセルでいうと`B3`のServoのvalueをLINEから送られてきた値に変更する設定**を行なっています。

> ![スクリーンショット 2024-06-21 1.17.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/deedfb6d-c2e6-a7ce-c604-f33f3324385e.png "スクリーンショット 2024-06-21 1.17.39.png")

ちなみにnowの変数は現在時間が入りますが、以下のGIFを参考に設定してみてください。

> ![](https://i.gyazo.com/4c317db80895d4c590865312d9c9bf4b.gif)

リプライメッセージも少し調整してみます。

> ![](https://i.gyazo.com/b713cfccddd8caba350c997a58300604.png)

これでRun Onceを行いLINEに話かけてみましょう。

> ![](https://i.gyazo.com/ea17b3b7260639d08b5d6a5852c40265.gif)

更新されましたね。

これだけでも簡易的には使えそうな仕組みだと思います。

## 4. ちょっとスマートに変更してみる

これだけでも簡易的には使えそうですが、現状はデバイスがサーボ（3行目を決め打ちにしている）の値だけ変更でき、カラーLEDの値の変更は現状できません。

LINEでデバイス名と値を送ってシートの値を変更させるようにしてみます。

**"ColorLED 255,0,0"とLINEに送るとColorLEDを検索して2行目の値を255,0,0に変更**し、"Servo 10"とLINEに送るとServoを検索して3行目の値を10に変更するような仕組みにしてみます。

"ColorLED 255,0,0"

### 4-1. 変数を設定 - device

`LINEのWatch Eventsモジュール`と`スプレッドシートのUpdate a Rowモジュール`の間に`Set variableモジュール`を接続します。

> ![](https://i.gyazo.com/3ab7d9c49eef752480fea583c8d3d518.png)

以下を指定します。

- Variable name: device
- Variable lifetime: `One cycle` （ここよく分かってない。。苦笑）
- Variable Value: `{{first(split(1.events[].message.text; space))}}`

> ![](https://i.gyazo.com/aca99d4cb1fdd99b1275cc1331033f28.png)

#### Tips: Makeのsplit関数とfirst関数

`Variable Value`の式の解説をします。

まず`split()`という関数があり、`split(<文字列>;<区切り文字>)`という使い方で特定の文字列を分割して扱うことができます。

仮に`hello-world`という文字があった場合`split(hello-world;-)`と書くことで`-`で区切った前後の文字を分割して配列という形式にできます。`["hello","world"]`という形式になります。

さらに`first()`を使うことで配列の最初の要素を取得できます。この場合"hello"を抜き出すことができます。

この話を踏まえて、以下の書き方をすることで"Servo 10"とLINEに送られてきた文字の中のServoの部分だけを抽出できます。

> ![スクリーンショット 2024-06-21 1.42.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/d95155cf-4ff6-c18e-3047-d4f9b2d713c8.png "スクリーンショット 2024-06-21 1.42.33.png")
> コピペ用: `{{first(split(1.events[].message.text; space))}}`

### 4-2. 変数を設定 - value

同じ要領で二つ目の変数を設定します。

- Variable name: value
- Variable lifetime: `One cycle` （ここよく分かってない。。苦笑）
- Variable Value: `{{last(split(1.events[].message.text; space))}}`

先ほどのfirst()とは逆でlast()を指定することで配列の最後の値を取得できます。

> ![](https://i.gyazo.com/e7eff1dc97d7736b1e84f43d2bcc4185.png)

### 4-3. Search Rowモジュールを追加

スプレッドシートのモジュールで行を検索する`Search Rowモジュール`を追加します。
二つ目の`Set variableモジュール`の右に追加しましょう。

> ![](https://i.gyazo.com/006e75f8f504fab2b44a14a231db48a2.png)

↑のスクリーンショットのように設定します。

- Table contains headers: Yes（たぶんデフォルト）
- Column range: A-CZ （たぶんデフォルト）
- Filter:
	- （列指定）: device(A)
	- Text operators: Equal to
	- (値指定): 先ほど設定した変数の`device`
- Sort order: Ascending （たぶんデフォルト）
- Order by: Row number （これで検索した行番号が出力される）
- Field Type: Number

> Set variableで設定したdeviceという変数が使えるようになっているはず...
> ![](https://i.gyazo.com/7f889076f5bffffb9b4a0825a9b34fea.png)

### 4-4: Update Rowモジュールの更新

スプレッドシートのUpdate Rowモジュールを先ほど設定した変数などに設定変更をします。

- Row Number: （Search Rowからの変数の）`Row number`
- Value（B）: （SetVariableで設定した変数の）`Value`

> ![](https://i.gyazo.com/17e5817c79ab378c0d48e36efc5915df.gif)

### 4-5: Send a Reply Messageの内容も更新

ここはやらなくても大丈夫ですが、LINE Botの見栄えて的に更新しておきます。

> ![](https://i.gyazo.com/8896e096d32e182846fae583e550ea52.png)

## 完成

Makeのシナリオはこんな感じです。

> ![](https://i.gyazo.com/309bdb381acd3a4b27e393bf3646c3db.png)

`ColorLED 255,10,0`などとLINEで送るとColorLEDの行を検索して、値を変えてくれるようになりました。

> ![](https://i.gyazo.com/e5629a9695b3fd51a6b8ddbb81455a63.gif)

**ちょっとスマートですね。**