LoginSignup
1
1

More than 3 years have passed since last update.

GASを使ってGoogleスプレッドシートからFilemakerにデータを持ってくる方法

Last updated at Posted at 2020-09-15

目的

  • スプレッドシートが親のケースで任意のタイミングで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
  • レイアウト作ったら更新ボタンでも作ってスクリプトを仕込めば完成。

まとめ

  1. 便利なAPIとかコネクタは無いのでcURLで無理やり持ってくる
  2. JSONに加工して出力する
  3. FM側の全データをスプレッドシートのデータに入れ替える

今回は、スプレッドシートがマスターだったのでこういった感じになりました。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1