作成日:2025年05月05日
FileMakerからGoogleSpreadSheetを利用してExcelファイルを作成する(2)

Tokenの再取得処理
さて、先程の処理でアクセストークンを取得しました
このアクセストークンを使用してAPIにアクセスするのですが、当然ながら有効期限が設定されています
3600秒、即ち1時間経過すると無効になってしまうのです
これまでの取得作業は結構面倒だったと思います
これを毎回行うのはとても大変です
そんな時に利用するのがリフレッシュトークンです
このリフレッシュトークンを使用すれば手軽にアクセストークンが再発行できます
こちらは6ヶ月使用しないと無効になってしまいますが、その間に使用すれば有効期限が延長されます
定期的に実行する様にしておけば、事実上無期限に使用できる訳です
それでは、アクセストークンの再取得処理を作成してみましょう
Token再取得
# ################################################## # Token再取得 # ################################################## レイアウト切り替え [「トークン生成」(spreadSheet); アニメーション:なし] If [Get ( タイムスタンプ ) >= spreadSheet::refreshTokenLimit] # リフレッシュトークンの期限切れ カスタムダイアログを表示 ["警告"; "リフレッシュトークンが不使用期間が長いために無効となりました¶再取得してください"] 全スクリプト終了 Else If [Get ( タイムスタンプ ) >= spreadSheet::accessTokenLimit] # アクセストークンの期限切れ 変数を設定 [$url; 値: "https://www.googleapis.com/oauth2/v4/token"] 変数を設定 [$id; 値: "<>"] 変数を設定 [$secret; 値: "<>"] 変数を設定 [$refresh; 値: spreadSheet::refreshToken] 変数を設定 [$grant; 値: "refresh_token"] 変数を設定 [$curl; 値: "-d \"client_id=" & $id & "&client_secret=" & $secret & "&refresh_token=" & $refresh & "&grant_type=" & $grant & "\""] URLから挿入 [選択; ダイアログあり:オフ; ターゲット:$result; $url; cURLオプション:$curl; URLを自動的にエンコードしない] # Token再取得 変数を設定 [$token; 値: JSONGetElement ( $result; "access_token" )] フィールド設定 [spreadSheet::accessToken; $token] フィールド設定 [spreadSheet::accessTokenLimit; Get ( タイムスタンプ ) + 3600] フィールド設定 [spreadSheet::refreshTokenLimit; Get ( タイムスタンプ ) + 15552000] End If
これでアクセストークンが再取得できます
実行すれば途中で作業を必要としないので、手軽に実行できます
スプレッドシートの操作
ようやく本命のスプレッドシートの操作です
枠サイズを変更したり、罫線を引いたりと色々な操作が可能ですが、ここでは基本操作だけ説明していきます
新規作成
新規スプレッドシートを作成します
作成場所は、マイドライブのカレントフォルダとなります
場所変更する場合は、Drive APIを使用すれば対応できます
新規作成
# ################################################## # 新規スプレッドシートを作成 # ################################################## スクリプト実行 [指定:一覧から;「Token再取得」; 引数: ] 変数を設定 [$token; 値: spreadSheet::accessToken] # 新規作成処理 変数を設定 [$url; "https://sheets.googleapis.com/v4/spreadsheets"] 変数を設定 [$curl; ""] 変数を設定 [$curl; $curl & "-X POST 'https://sheets.googleapis.com/v4/spreadsheets' \ "] 変数を設定 [$curl; $curl & "-H \"Authorization: Bearer " & $token & "\" \ "] 変数を設定 [$curl; $curl & "-H \"Content-Type: application/json\""] 変数を設定 [$curl; $curl & "-H \"Content-Length: 0\""] URLから挿入 [選択; ダイアログあり:オフ; ターゲット:$result; $url; cURLオプション:$curl; URLを自動的にエンコードしない] # 作成したファイルのIDを格納 フィールド設定 [spreadSheet::createSheetID; JSONGetElement ( $result; "spreadsheetId" )] カスタムダイアログを表示 ["報告"; "新規スプレッドシートを作成しました"]
これを実行すれば新規スプレッドシートが作成されました
作成したファイルのIDは「createSheetID」フィールドに格納していますので、内容を修正する場合はこのIDを使用します
ファイル名変更
スプレッドシートの名前を変更します
新規作成するのであれば、その時に名前が付けられると思うのですが、やり方が分からなかったので、作成後に変更する事を想定しています
ファイル名変更
# ################################################## # ファイル名の変更 # ################################################## スクリプト実行 [指定:一覧から;「Token再取得」; 引数: ] 変数を設定 [$token; 値: spreadSheet::accessToken] # ファイル名変更 変数を設定 [$filename; 値: "<<変更後の名前>>"] 変数を設定 [$id; 値: spreadSheet::createSheetID] 変数を設定 [$request; 値: ""] 変数を設定 [$request; 値: JSONSetElement ( $request; "requests[0].updateSpreadsheetProperties.properties.title"; $filename; 1 )] 変数を設定 [$request; 値: JSONSetElement ( $request; "requests[0].updateSpreadsheetProperties.fields"; "title"; 1 )] 変数を設定 [$url; "https://sheets.googleapis.com/v4/spreadsheets/" & $id & ":batchUpdate"] 変数を設定 [$curl; "-H \"Authorization: Bearer " & $token & "\" -H \"Content-Type: application/json\" -X POST -d " & $request] URLから挿入 [選択; ダイアログあり:オフ; ターゲット:$result; $url; cURLオプション:$curl; URLを自動的にエンコードしない] カスタムダイアログを表示 ["報告"; "ファイル名を「" & $filename & "」に変更しました"]
以上で当該ファイルの名前が変更されます
読み取り
スプレッドシートに入力された値を取得したいという場合は多いでしょう
シートやセルを指定して取得する事ができます
取得
# ################################################## # 読み取り処理 # ################################################## スクリプト実行 [指定:一覧から;「Token再取得」; 引数: ] 変数を設定 [$token; 値: spreadSheet::accessToken] # 読み取り処理 変数を設定 [$range; 値: "シート1!A1:B2"] 変数を設定 [$id; 値: spreadSheet::createSheetID] 変数を設定 [$url; "https://sheets.googleapis.com/v4/spreadsheets/" & $id & "/values/" & $range] 変数を設定 [$curl; "-H \"Authorization: Bearer " & $token & "\" -H \"Content-Type: application/json\""] URLから挿入 [選択; ダイアログあり:オフ; ターゲット:$result; $url; cURLオプション:$curl; URLを自動的にエンコードしない] カスタムダイアログを表示 ["報告"; $result]
これで、指定のセルの値がJSON形式で取得できます
例えば、下記の様な形式となります
取得結果
入力
最後はデータの入力です
シート、セル、変更内容をJSON形式で指定して実行します
入力
# ################################################## # 入力処理 # ################################################## スクリプト実行 [指定:一覧から;「Token再取得」; 引数: ] 変数を設定 [$token; 値: spreadSheet::accessToken] # ファイル名変更 変数を設定 [$id; 値: spreadSheet::createSheetID] 変数を設定 [$range; 値: "シート1!A1"] 変数を設定 [$url; 値: "https://sheets.googleapis.com/v4/spreadsheets/" & $id & "/values/" & $range & ":append?valueInputOption=RAW&insertDataOption=OVERWRITE"] 変数を設定 [$request; 値: ""] 変数を設定 [$request; 値: JSONSetElement ( $request; "range"; $range; 1 )] 変数を設定 [$request; 値: JSONSetElement ( $request; "majorDimension"; "ROWS"; 1 )] 変数を設定 [$request; 値: JSONSetElement ( $request; "values"; "[[\"test1\"]]"; 4 )] 変数を設定 [$curl; ""] 変数を設定 [$curl; $curl & "-X POST \ "] 変数を設定 [$curl; $curl & "-H \"Authorization: Bearer " & $token & "\" \ "] 変数を設定 [$curl; $curl & "-H \"Content-Type: application/json\" \ "] 変数を設定 [$curl; $curl & "-d " & $request] URLから挿入 [選択; ダイアログあり:オフ; ターゲット:$result; $url; cURLオプション:$curl; URLを自動的にエンコードしない] カスタムダイアログを表示 ["報告"; $result]
この処理を実行すると、A1セルに「test1」が入力されます
また、下記の様なJSONが返されます
取得結果
FileMakerからテンプレートに流し込む
それでは、これまでと同様にプロフィールカードのテンプレートに流し込む処理を実行します
テンプレート部分の作成もAPIで実行する事もできますが、面倒なので事前に用意します

スクリプト処理ですが、以下の流れで作成します
- テンプレートを複製する
- 複製ファイルの名前を変える
- テキストを流し込む
- 画像ファイルをGoogle Driveへアップロードする
- 画像をリンクする
この流れに沿って作成したのが以下の通りです
スプシ作成
# ################################################## # スプレッドシートの作成 # ################################################## スクリプト実行 [指定:一覧から;「Token再取得」; 引数: ] 変数を設定 [$token; 値: spreadSheet::accessToken] # テンプレートファイルを複製 変数を設定 [$tempID; 値: spreadSheet::createSheetID] 変数を設定 [$url; 値: "https://www.googleapis.com/drive/v3/files/" & $tempID & "/copy"] 変数を設定 [$curl; 値: $curl & "-X POST 'https://www.googleapis.com/drive/v3/files/" & $tempID & "/copy' \ "] 変数を設定 [$curl; 値: $curl & "-H \"Authorization: Bearer " & $token & "\" \ "] 変数を設定 [$curl; 値: $curl & "-H \"Accept: application/json\" \ "] 変数を設定 [$curl; 値: $curl & "-H \"Content-Type: application/json\" \ "] 変数を設定 [$curl; 値: $curl & "-H \"Content-Length: 0\""] URLから挿入 [選択; ダイアログあり:オフ; ターゲット:$result; $url; cURLオプション:$curl; URLを自動的にエンコードしない] 変数を設定 [$id; 値: JSONGetElement ( $result; "id" )] レイアウト切り替え [「data」(data); アニメーション:なし] フィールド設定 [data::spreadSheetID; $id] # 複製ファイルの名前を変更 変数を設定 [$filename; 値: "プロフィールカード"] 変数を設定 [$request; 値: ""] 変数を設定 [$request; 値: JSONSetElement ( $request; "requests[0].updateSpreadsheetProperties.properties.title"; $filename; 1 )] 変数を設定 [$request; 値: JSONSetElement ( $request; "requests[0].updateSpreadsheetProperties.fields"; "title"; 1 )] 変数を設定 [$url; 値: "https://sheets.googleapis.com/v4/spreadsheets/" & $id & ":batchUpdate"] 変数を設定 [$curl; 値: "-H \"Authorization: Bearer " & $token & "\" -H \"Content-Type: application/json\" -X POST -d " & $request] URLから挿入 [選択; ダイアログあり:オフ; ターゲット:$result; $url; cURLオプション:$curl; URLを自動的にエンコードしない] # ##### データの流し込み ##### # 名前~特技 変数を設定 [$range; 値: "シート1!E4:E14"] 変数を設定 [$request; 値: ""] 変数を設定 [$request; 値: JSONSetElement ( $request; "range"; $range; 1 )] 変数を設定 [$request; 値: JSONSetElement ( $request; "majorDimension"; "ROWS"; 1 )] 変数を設定 [$request; 値: JSONSetElement ( $request; "values"; "[ [\"" & data::名前 & "\"], [\"\"], [\"" & data::ふりがな & "\"], [\"\"], [\"" & data::生年月日 & "\"], [\"\"], [\"" & data::血液型 & "\"], [\"\"], [\"" & data::趣味 & "\"], [\"\"], [\"" & data::特技 & "\"] ]"; 4 )] 変数を設定 [$curl; 値: ""] 変数を設定 [$curl; 値: $curl & "-X POST \ "] 変数を設定 [$curl; 値: $curl & "-H \"Authorization: Bearer " & $token & "\" \ "] 変数を設定 [$curl; 値: $curl & "-H \"Content-Type: application/json\" \ "] 変数を設定 [$curl; 値: $curl & "-d " & $request] 変数を設定 [$url; 値: "https://sheets.googleapis.com/v4/spreadsheets/" & $id & "/values/" & $range & ":append?valueInputOption=RAW&insertDataOption=OVERWRITE"] URLから挿入 [選択; ダイアログあり:オフ; ターゲット:$result; $url; cURLオプション:$curl; URLを自動的にエンコードしない] # 自己PR 変数を設定 [$range; 値: "シート1!C20"] 変数を設定 [$request; 値: ""] 変数を設定 [$request; 値: JSONSetElement ( $request; "range"; $range; 1 )] 変数を設定 [$request; 値: JSONSetElement ( $request; "majorDimension"; "ROWS"; 1 )] 変数を設定 [$request; 値: JSONSetElement ( $request; "values"; "[[\"" & data::自己PR & "\"]]"; 4 )] 変数を設定 [$curl; 値: ""] 変数を設定 [$curl; 値: $curl & "-X POST \ "] 変数を設定 [$curl; 値: $curl & "-H \"Authorization: Bearer " & $token & "\" \ "] 変数を設定 [$curl; 値: $curl & "-H \"Content-Type: application/json\" \ "] 変数を設定 [$curl; 値: $curl & "-d " & $request] 変数を設定 [$url; 値: "https://sheets.googleapis.com/v4/spreadsheets/" & $id & "/values/" & $range & ":append?valueInputOption=RAW&insertDataOption=OVERWRITE"] URLから挿入 [選択; ダイアログあり:オフ; ターゲット:$result; $url; cURLオプション:$curl; URLを自動的にエンコードしない] # フリースペース 変数を設定 [$range; 値: "シート1!C29"] 変数を設定 [$request; 値: ""] 変数を設定 [$request; 値: JSONSetElement ( $request; "range"; $range; 1 )] 変数を設定 [$request; 値: JSONSetElement ( $request; "majorDimension"; "ROWS"; 1 )] 変数を設定 [$request; 値: JSONSetElement ( $request; "values"; "[[\"" & data::フリースペース & "\"]]"; 4 )] 変数を設定 [$curl; 値: ""] 変数を設定 [$curl; 値: $curl & "-X POST \ "] 変数を設定 [$curl; 値: $curl & "-H \"Authorization: Bearer " & $token & "\" \ "] 変数を設定 [$curl; 値: $curl & "-H \"Content-Type: application/json\" \ "] 変数を設定 [$curl; 値: $curl & "-d " & $request] 変数を設定 [$url; 値: "https://sheets.googleapis.com/v4/spreadsheets/" & $id & "/values/" & $range & ":append?valueInputOption=RAW&insertDataOption=OVERWRITE"] URLから挿入 [選択; ダイアログあり:オフ; ターゲット:$result; $url; cURLオプション:$curl; URLを自動的にエンコードしない] # 写真のアップロード 変数を設定 [$filename; 値: "image.jpg"] 変数を設定 [$file; 値: data::写真] 変数を設定 [$curl; 値: ""] 変数を設定 [$curl; 値: $curl & "-X POST -L \"https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart\" \ "] 変数を設定 [$curl; 値: $curl & "-H \"Authorization: Bearer " & $token & "\" -H \"Content-Type: multipart/form-data\" \ "] 変数を設定 [$curl; 値: $curl & "-F \"metadata={name : '" & $filename & "'};type=application/json;charset=UTF-8\" \ "] 変数を設定 [$curl; 値: $curl & "-F file=@$file"] 変数を設定 [$url; 値: "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart"] URLから挿入 [選択; ダイアログあり:オフ; ターゲット:$result; $url; cURLオプション:$curl; URLを自動的にエンコードしない] 変数を設定 [$photoID; 値: JSONGetElement ( $result; "id" )] # 写真の配置 変数を設定 [$range; 値: "シート1!C29"] 変数を設定 [$request; 値: ""] 変数を設定 [$request; 値: JSONSetElement ( $request; "range"; $range; 1 )] 変数を設定 [$request; 値: JSONSetElement ( $request; "majorDimension"; "ROWS"; 1 )] 変数を設定 [$request; 値: JSONSetElement ( $request; JSONSetElement ( $request; "values"; "[[\"=IMAGE(\\\"https://drive.google.com/uc?export=download&id=" & $photoID & "\\\",4,180,180)\"]]"; 4 )] 変数を設定 [$curl; 値: ""] 変数を設定 [$curl; 値: $curl & "-X POST \ "] 変数を設定 [$curl; 値: $curl & "-H \"Authorization: Bearer " & $token & "\" \ "] 変数を設定 [$curl; 値: $curl & "-H \"Content-Type: application/json\" \ "] 変数を設定 [$curl; 値: $curl & "-d " & $request] 変数を設定 [$url; 値: "https://sheets.googleapis.com/v4/spreadsheets/" & $id & "/values/" & $range & ":append?valueInputOption=RAW&insertDataOption=OVERWRITE"] URLから挿入 [選択; ダイアログあり:オフ; ターゲット:$result; $url; cURLオプション:$curl; URLを自動的にエンコードしない] カスタムダイアログを表示 ["報告"; "プロフィールカードを作成しました"]
これでスクリプトは完成です
早速実行してみましょう

出来上がったスプレッドシートを開くと、警告が出て画像が表示されていません
どうやら画像表示に許可を与える必要がある様です

許可を与えれば、無事表示されました
サンプルファイル
以上でGoogle Sheets APIを利用した処理は完成です
他に上手い方法があるかも知れませんが、現時点で画像が手間なしで表示されないのが問題です
また、作成ファイルのダウンロードもセキュリティ上、色々と難しい事になりそうです
手軽に利用するにはまだまだ検討が必要そうです
今回作成したファイルを公開していますので、ご興味がありましたらこちらからダウンロードしてご確認ください

以上で今日のメモ書きは終了です
内容はいかがでしたか?
もしご意見やご要望、誤りの指摘などありましたら、下記フォームよりお気軽にご連絡ください