目的
- スプレッドシートが親のケースで任意のタイミングでFilemakerにデータを同期する。
- 特にそこまでセキュリティが必要無いシートを想定しています。
もう少し固めるなら次の記事で解説しています。
方法
- タイトルにもあるがGASを用いる事でサーバーを立てることなく実現した。
恐らくデータが一定を超えるとGASの6分ルールに抵触するのでダメになりそう。 - データを一括でスプレッドシートの内容に入れ替えるので、更新があったものだけやる場合は面倒そう
……ヤダヤダ
GAS
ソースは以下からお借りし、元ネタはJSONP向けのようでそのままでは使えないっぽかったので改変しました。
具体的にはjsondataあたりを消してMimeTypeをJSONにしました(これいる?)(素人)。
元ネタ:https://www.koreyome.com/web/make-spreadsheet-to-json-at-google-apps-script/
引用記事:https://qiita.com/taichi0514/items/ee6dedff45f9d9e58ef4
Script
function getData(id, sheetName) {
var sheet = SpreadsheetApp.openById(id).getSheetByName(sheetName);
var rows = sheet.getDataRange().getValues();
var keys = rows.splice(0, 1)[0];
return rows.map(function(row) {
var obj = {}
row.map(function(item, index) {
obj[keys[index]] = item;
});
return obj;
});
}
function doGet(request) {
var data = getData('~ここにスプレッドシートのID~', '~シート名~');
return ContentService.createTextOutput( JSON.stringify(data, null, 2) )
.setMimeType(ContentService.MimeType.JSON);
}
設定
公開>Webアプリケーションとして導入
公開範囲はAnyone, even anonymous
にする(cURLでアクセスするため)。
後はFM側でシコシコスクリプトいじり。
Filemaker
こっちでやることは、cURLでデータをよこせオラァ!して新規レコードつくってぶち込むだけ(だけとは)。
Script
URLから挿入 [選択; ダイアログあり:オフ; ターゲット:$result;
"https://script.google.com/macros/s/hogefuga/... ;
cURL オプション: "-L"
- ターゲットを変数の
$result
- URLの指定はさっきGASで発行したURL。もろちん$URLとかの変数にした方が管理しやすいよ。
- cURLオプションはいるかわからんけど
-L
をいれとく
レコードの更新は公式のここを参考にしました。[" & $i & "]
の後に半角スペースあると泣くので詰めよう。
https://fmhelp.filemaker.com/help/17/fmp/ja/index.html#page/FMP_Help%2Fjson-functions.html%23
変数を設定 [$ProductCount ; 値:
ValueCount (
JSONListKeys ($result ; "") //←例のようにオブジェクトは無いので""にした
)]
変数を設定 [$i ; 値: 0]
If [$ProductCount > 0]
全レコードを表示
対象レコード削除 [ダイアログあり:オフ] //←消さないと同じレコードがどんどん増えるよ
Loop
新規レコード/検索条件
フィールド設定 [製品::ID ;
JSONGetElement ($result ; "JSONGetElement ( $result ; "[" & $i & "]ID" )")]
//↑この部分、例では[" & $i & "]の後に半角スペースあるけど、オブジェクトが無い場合?詰めないとnullが出力される(なんで?)
フィールド設定 [製品::価格 ;
JSONGetElement ($result ; "JSONGetElement ( $result ; "[" & $i & "]品名" )")]
フィールド設定 [製品::在庫 ;
JSONGetElement ($result ; "JSONGetElement ( $result ; "[" & $i & "]価格" )")]
レコード/検索条件確定 [ダイアログあり: オフ]
変数を設定 [$i ; 値 : $i + 1]
Exit Loop If [$i ≥ $ProductCount]
End Loop
End If
- レイアウト作ったら更新ボタンでも作ってスクリプトを仕込めば完成。
まとめ
- 便利なAPIとかコネクタは無いのでcURLで無理やり持ってくる
- JSONに加工して出力する
- FM側の全データをスプレッドシートのデータに入れ替える
今回は、スプレッドシートがマスターだったのでこういった感じになりました。