Claris Connect を使って Google SpreadSheet からデータを取得する

Claris Connect をいろいろと触っていた中で扱った内容のうち、比較的需要のありそうな Google SpreadSheet からのデータの取得について、いくつかの注意点を押さえながら簡単にまとめます。

# 大まかな流れ
1. Claris Connect で webhook URL を作成
2. GAS で SpreadSheet のデータを JSON 形式にして `UrlFetchApp.fetch` で Claris Connect に渡す
3. 新規レコードを作成して受け取った JSON から適切に各種フィールドに割り当てる
4. 日付に関してはスクリプトに渡して `GetAsDate` で日付形式にして入れる

# webhook URL の発行
好きなプロジェクトから新しく Flow を作成します。　今回は本の著者名とタイトル、読んだ日についてのリストを作成したい状況だとします。名前もそれっぽく適当に。
![スクリーンショット 2021-12-08 9.44.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1346492/b1f54658-0090-4c70-28c1-2d75366fd111.png)

トリガーは webhooks 選択して、
![スクリーンショット 2021-12-08 9.44.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1346492/f405cdec-9aa6-5e49-51d2-265499cbcafe.png)

既存のを使いまわしたいならそれを選択して、新規に作りたい場合は Create a new webhook を選択して名前を決めます。
![スクリーンショット 2021-12-08 9.45.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1346492/aaabfd1f-9369-a186-b109-9d30a47f67c4.png)
![スクリーンショット 2021-12-08 9.45.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1346492/93fc1352-e60e-3215-ce01-678d9747749d.png)


発行される URL はおそらく `https://[***].apps.connect.claris.com/api/webhook/v1/[webhook のなまえ]/catch` の形式のはずです。この URL を GAS で使用します。

GAS に移る前にフローの序盤、新規レコード作成のところまで作っておきます。これはなんでかと言うと、一度「慣らし運転」的に webhook で JSON を渡すことで Claris Connect 側に各要素を認識させる必要があるからです。

今回は FileMaker Server 上のデータベースに著者名などを渡すことを目的として、 Claris FileMaker Server > Create record と進み、データベースを選択します（今回は一度接続したものを "for test" という名前にしました）。
![スクリーンショット 2021-12-08 12.06.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1346492/95af11a8-3743-6983-8244-f0b85e09a804.png)

対象となるレイアウトを選択すると、そのレイアウト上にあるフィールドが表示されます。
そのレイアウト上にあるフィールドが表示されるのですが、逆に言えば **そのレイアウトの元になっているテーブルにあるフィールドでもレイアウト上に表示されていなければここには表示されません。**
![スクリーンショット 2021-12-08 12.06.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1346492/2213288a-e0fc-a79e-cd5f-2d36ea2f66c4.png)

今回テーブルには 5 つのフィールドがありますが、レイアウト上に表示されていない id と created_at は Claris Connect の Create record では入力できません。（もちろんスクリプトにスクリプト引数として渡してフィールドを設定する方法は可能です）
 ![スクリーンショット 2021-12-08 12.09.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1346492/2a7b0ef7-5fd7-4eed-a2ec-7161e04fda02.png)

![スクリーンショット 2021-12-08 12.09.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1346492/6d94b277-70b5-8833-7ab2-6b44db9cadfc.png)

さて、この状態で一度 save しておきます。次にスプレッドシートと GAS を用意します。


# スプレッドシートと GAS でデータを Claris Connect に送信
適当なスプレッドシートを用意します。
今回は本の著者名、タイトル、読んだ日のリストにしてみました。
![スクリーンショット 2021-12-08 10.22.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1346492/4fb333a0-2eef-4c31-6fe2-a102822393fe.png)

GAS は以下の通り、最終行の 3 つ情報を JSON 形式に整形して webhook URL に JSON を options としてくっつけて渡します。
今回のメインの内容は GAS の紹介ではないので、トリガ設定などは特にしていません。必要に応じて適宜使ってください。

```
function sendJSONtoCC(e){

  const mySheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1');
  
  // 最終行、列の取得
  const lastRow = mySheet.getLastRow();
  const lastColumn = mySheet.getLastColumn();

  // 最終行を JSON にする
  const values = mySheet.getRange(lastRow, 1, 1, lastColumn).getValues();
  const sendJSON = {
    "author" : values[0][0],
    "tiitle" : values[0][1],
    "read_date" : values[0][2],
  };
  const options = {
    "method" : "POST",
    "contentType" : "application/json",
    "payload" : JSON.stringify(sendJSON)
  };

  // Claris Conect へ転送
  const url = 'https://[******].apps.connect.claris.com/api/webhook/v1/book_list/catch';
  const response = UrlFetchApp.fetch(url, options);
}
```
URL は先ほど発行した webhook のものを使ってください。


# Claris Connect で JSON の要素を扱う
この状態で GAS を一度実行します。現状では Claris Connect 側ではフィールドの内容を設定していないので「空」のレコードになります。
ですが、これを一度通すことで、Claris Connect 側で webhook で送信している JSON の要素の解析をしてくれて、JSON の要素を Claris Connect 上で扱えるようになります。

1 つ目のステップである webhook トリガーで取得した JSON の body 中に author, title, read_date がありますね。値は先ほど実行した GAS で渡した内容が反映されていますが、もちろん実行ごとに送信した内容が入ります。サンプルとして参照しましょう。
![スクリーンショット 2021-12-08 12.20.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1346492/9d5c5693-5889-2a79-adef-02135d302379.png)



Create record の内容を入れていくのですが、ここでは著者名を body.author, タイトルを body.title とだけしておきます。

![スクリーンショット 2021-12-08 9.57.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1346492/0aa66fa1-dd82-a4a6-44c9-2235eff4ccb1.png)

これはなんでかと言うと、なんと body.read_date（今回の値は 2021/07/10）を date に入れると、日付フィールドの validation で怒られてしまうからです。
![スクリーンショット 2021-12-08 10.29.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1346492/93f0ab72-9fbb-5aab-8879-19650222d481.png)




# 日付の処理
Claris Connect 上には日付に関して format するアクションが用意されています。
アクションの Utilities から Dates > format を選択すると、日付の変数をプルダウンから用意されている形式に変換してくれます。

![スクリーンショット 2021-12-08 12.25.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1346492/3e4a4e00-41ae-4e6d-3cbd-a2769f80acaa.png)
![スクリーンショット 2021-12-08 12.26.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1346492/cac7575d-c7b0-669c-e63d-2c5f8c881363.png)

ですが、これを噛ませてみても、Create record で日付型じゃないよと言われてしまいます。困ったちゃんです。Dates の format で返ってくるのが string となっているので、そのせいなのでしょうか？
![スクリーンショット 2021-12-08 12.32.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1346492/697f9621-52a7-fb7f-14ec-5c9f9928c322.png)

兎にも角にもこのままでは進まないので、日付の入力に関してはスクリプト引数として渡してスクリプト側で入力することにする必要があります。

ということで、データベース側で簡単に日付を受け取ってフィールドに入れるスクリプトを用意します。
JSON でテキストを渡して、 GetAsDate で日付として扱うようにします。
![スクリーンショット 2021-12-08 12.40.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1346492/3e9f8815-3f84-c576-c463-70bc7bc9f498.png)

Claris Connect 側では、対処のレイアウトと先ほど作ったスクリプトを選択します。
Script Parameter に "Only strings are supported" とありますが、ここに JSON 形式で渡したい値を設定します。ただし、この中での改行は許されていないため、今回は渡す値が 1 つだけなので比較的すっきりしていますが、複数ある場合はちょっと見づらいです。がんばりましょう。（あと今回でいうところの body.read_date を囲む "" を忘れがち（個人の感想））
![スクリーンショット 2021-12-08 12.41.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1346492/f3d942d7-2c61-a74f-af5c-91ed9de7f3fd.png)

# 動作確認
これで準備完了です。
Claris Connect のフローとしては webhook トリガ、著者名とタイトルを入れて新規レコードを作成、日付をスクリプトで入力、の 3 ステップになります。
![スクリーンショット 2021-12-08 13.07.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1346492/1437df12-f461-6ca3-6957-5a3ed4e6230d.png)



先ほどのスプレッドシートに試しに 1 行追加してから GAS を動かしてみると……

![スクリーンショット 2021-12-08 12.48.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1346492/dfc87240-a74f-7918-4ec1-27dd56342cb0.png)

![スクリーンショット 2021-12-08 12.52.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1346492/af54586d-b1a5-c365-db50-da129217105c.png)

良さそうですね！

また、Claris Connect の History からログが見られます。これまで見てきた日付の validation error もここから確認したものでした。
![スクリーンショット 2021-12-08 12.54.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1346492/c0b78cfa-68e1-074a-0ba3-0ba94b461589.png)


# まとめ
Claris Connect を用いて Google SpreadSheet から GAS を使ってレコードを作成する流れについて解説しました。
今回重要なポイントとしては、日付に関しては JSON で渡された値をそのまま入れると validation error を出してくるところで、**実は（案の定？）タイムスタンプに関しても同様の現象が起きます。**
日付とタイムスタンプだけ別途スクリプトで渡すのは結構めんどくさいので改善してくれないかなという気持ちはありますが、一応今回紹介したスクリプト側でどうにかしてもらう方法で解決ができます。

先日 [Claris Connect から実行するスクリプトでは他ファイルを参照できない](https://qiita.com/s_yarma/items/9be248c3155920f99201)という記事も書きましたが、いろいろな外部サービスのアクションが増えつつある Claris Connect ですが、もっとホームといいますか FileMaker そのものに対する使いやすさもちゃんと整備してくれると嬉しいなぁと思います。