請求書アプリのユースケースで、 AppSheet Automationのタスク(Task)設定をマスターします。
前回(第4回)は、「Call a webhook」タスクを設定してLINEにプッシュ通知をしてみました。
今回は、「Call a script」タスクを設定して、AppSheetとGASを連携させます。
Driveサービスを使ってGoogleドライブにフォルダを作成したり、ファイルを移動してみましょう。
この記事で使用する請求書アプリは、ブログで解説している請求書アプリ(7回シリーズ)です。
ブログを読んでアプリを自作していない場合は、メルマガ購読者特典のサンプルアプリをダウンロードしても大丈夫です。
目次
1. AppSheet で発行した請求書を取引先別フォルダで管理する
GAS(Google Apps Script)とは
今回は、AppSheetとGASを連携させます。
GAS(Google Apps Script)とは、Googleが提供するプログラミング言語です。
GASで書かれたプログラムのことを「スクリプト」と呼びます。
AppSheetでは、「Call a script」タスクからGASを呼び出して使うことができます。例えば、
- AppSheetからGoogle Workspaceのサービス(Gmail、スプレッドシート、ドライブなど)を操作する
- AppSheetからGASを経由して外部サービスと連携する
- AppSheet単体では難しい複雑な処理をGASで実行する
という使い方ができます。
AppSheetはノーコード開発ツールなので、エディタ画面で設定するだけでアプリが作れます。
しかし、AppSheetに用意されている設定以上のことはできないので、開発の自由度は制限されます。
それに対して、GASはスクリプトを書くことで比較的自由に機能を開発できます。
GASと連携することで、AppSheetでの開発がやりやすくなったり、機能拡張ができるようになります。
DriveサービスでGoogleドライブを操作する
今回は、「AppSheetで作成した請求書ファイルを取引先別フォルダで管理する」ことにチャレンジします。
第2回で「Create a new file」を使って、Excelの請求書ファイルを作成しました。
このファイルは、アプリフォルダ(請求書-xxxxxxx)内の「Files」フォルダに保存されています。
「Call a script」を使って「取引先名」フォルダを作成し、請求書ファイルをこのフォルダに移動します。
以上のように、
- Googleドライブにフォルダを作成する
- Googleドライブにあるファイルを移動する
時に使うのが、GASのDriveサービスです。
Driveサービスを使えば、Googleドライブ内のフォルダやファイルを操作(追加、移動、削除など)できます。
「Call a script」で実行するDriveサービスの手順は以下の通りです。
- 「Files」フォルダ内に保存されている請求書ファイルを検索して、ファイルIDを取得する
- 「Files」フォルダ内に「取引先名」フォルダがあるか検索する
- ある場合:フォルダIDを取得する
- ない場合:「取引先名」フォルダを作成して、フォルダIDを取得する
- 請求書ファイルを「取引先名」フォルダに移動する
- 「取引先名」フォルダの共有URLを取得して、関数の戻り値にする。
このブログはAppSheetの解説ブログなので、GASの書き方やDriveサービスの使い方について詳細な解説は行いません。
GASについて知識を深めたい場合は、以下のような専門書で学習してください。
2. GASのプロジェクトを作成する
AppSheet で請求書を保存しているフォルダIDを取得する
GASを書く前に、請求書ファイルを保存している「Files」フォルダのフォルダIDを取得しておきます。
Googleドライブの「マイドライブ」内にある「AppSheet」フォルダを開きます。
その中にある「data」フォルダを開きます。
「請求書アプリ-xxxxxxxx(ユーザーのアカウントID)」というアプリフォルダがあるので開きます。
このアプリフォルダ内にある「Files」フォルダを開きます。
請求書を未作成の場合は「Files」フォルダが存在しません。
第2回の記事を読んで請求書を作成するか、自分で追加してください。
「Files」フォルダを開くと、ブラウザのURLにフォルダIDが表示されます。
URL内の "folders/" 以下の部分がフォルダIDで、以下の {ID} の部分です。
後で使うので、{ID}をコピーして保存しておいてください。
https://drive.google.com/drive/folders/{ID}
GASプロジェクトを作成する
GASのスクリプトを書いてみましょう。
はじめに、GASのプロジェクトを作成します。
Googleドライブの左上にある「新規」をクリックします。
「その他」から「Google Apps Script」をクリックします。
GASのプロジェクトが作成されて、スクリプトエディタが開きます。
GASは、スクリプトエディタでスクリプトを書いたり、実行したりします。
プロジェクトの名前を付けます。
「無題のプロジェクト」をクリックします。
「プロジェクト タイトル」にプロジェクトの名前を入力します。
ここでは、「請求書Automation」という名前にしました。
スクリプトエディタでスクリプトを編集しましょう。
「Files」フォルダ内に「取引先名」フォルダを作成して、請求書ファイルを移動するためのスクリプトを以下のように書いてみました。
「フォルダID」の箇所に、先ほど保存しておいたフォルダIDをコピペします。
以下のスクリプトをスクリプトエディタにコピペします。
「フォルダID」の箇所を、自分のフォルダIDに置き換えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
function transferFile(fileName, partnerName) { const folderId = 'フォルダID'; const folder = DriveApp.getFolderById(folderId); const partnerFolder = createFolder(folder, partnerName); const params_file = 'title = "' + fileName + '"'; const fileIterator = folder.searchFiles(params_file); if (fileIterator.hasNext()) { const fileId = fileIterator.next().getId(); const file = DriveApp.getFileById(fileId); file.moveTo(partnerFolder); }else{ return; } return partnerFolder.getUrl(); } function createFolder(folder, partnerName){ const params_folder = 'title = "' + partnerName + '"'; const folderIterator = folder.searchFolders(params_folder); if (folderIterator.hasNext()) { const partnerFolderId = folderIterator.next().getId(); return partnerFolder = DriveApp.getFolderById(partnerFolderId); }else{ return partnerFolder = folder.createFolder(partnerName); } } |
GASの詳細な解説は省略して、スクリプトの各ブロックの役割について解説します。
1行目でtransferFile関数を定義しています。
この関数に、fileName(ファイル名)、partnerName(取引先名)という引数を設定しました。
この2つの引数はAppSheetの「Call a script」Taskから渡すことができます。
3〜4行目で「Files」のフォルダIDから、「Files」フォルダを取得しています。
5行目で、createFolder関数を実行して、「取引先名」フォルダを取得しています。
createFolder関数には2つの引数、folder(「Files」フォルダ)とpartnerName(取引先名)を設定します。
20行目以降のcreateFolder関数を見てみましょう。
21〜22行目で、partnerName(取引先名)と同じ名前のフォルダ(「取引先名」フォルダ)が、「Files」フォルダ内にあるか検索するためのイテレータというものを定義しています。
24〜29行目では「取引先名」フォルダが、
- ある場合:「取引先名」フォルダを取得する
- ない場合:「Files」フォルダ内に「取引先名」フォルダを作成する
という処理をしています。
26行目と28行目は、関数の実行結果として「取引先名」フォルダを返しています。
5行目のcreateFolder関数の実行結果、partnerFolderに「取引先名」フォルダが格納されます。
transferFile関数に戻ります。
7〜8行目は、fileName(ファイル名)と同じ名前のファイル(請求書ファイル)が、「Files」フォルダ内にあるか検索するためのイテレータというものを定義しています。
10〜16行目では請求書ファイルが、
- ある場合:請求書ファイルを取得して「取引先名」フォルダに移動する
- ない場合:何もしない(請求書ファイルは必ずあるので、この処理は行わない)
という処理をしています。
最後に17行目で、transferFile関数の実行結果として「取引先名」フォルダのURLを返します。
この結果は、AppSheetの「Call a script」Taskで受け取ることができます。
スクリプトを実行してアクセス許可する
GASスクリプトを実際に使うためには、スクリプトがGoogleドライブにアクセスして、ファイル操作することを許可する必要があります。
そのために、完成したスクリプトを実行します。
スクリプトエディタの「実行」をクリックしてください。
はじめてスクリプトを実行すると「承認が必要です」というダイアログが表示されます。
「権限を確認」をクリックします。
GASスクリプトを実行するGoogleアカウント(自分のGoogleアカウント)にログインします。
ログイン中のアカウントの場合はクリックするだけで、ログイン作業は必要ありません。
「このアプリはGoogleで確認されていません」というダイアログが表示されます。
左下にある「詳細」をクリックします。
左下に「請求書Automation(安全ではないページ)に移動」というリンクが表示されるので、クリックします。
「請求書AutomationがGoogleアカウントへのアクセスをリクエストしています」と表示されるので、「許可」をクリックします。
「許可」をするとスクリプトが実行されます。
実行すると、スクリプトエディタの「実行ログ」に以下のようなエラーが表示されます。
これは、AppSheetから引数を渡す前提でスクリプトを書いているので、「引数がありません」というエラーです。
問題ないので、無視しても大丈夫です。
3. Call a scriptを設定する
フォルダのURLを保存する列を追加する
「請求書Automation」を実行すると、「取引先名」フォルダのURLが戻り値として返ってきます。
AppSheetで受け取った戻り値を保存するために、「請求書」テーブルに列を追加しましょう。
エディタ左側メニュー「Data」をクリックします。
メインパネル右上の「View data source」をクリックします。
「請求書」ワークシートを開いて、「フォルダ」列を追加します。
アプリエディタに戻って、Dataナビゲーションで「請求書」テーブルを選択します。
「Regenerate Structure」をクリックします。
「Regenerate」をクリックします。
「フォルダ」列が追加されるので、TYPEを「Url」に変更します。
請求書のビュー(画面)も調整します。
エディタ右側のプレビュー画面、タブメニュー「請求書」を選択します。
作成済みの請求書をひとつ選択します。
プレビュー画面の下にある「View: 請求書_Detail」のリンクをクリックします。
請求書詳細ビュー(請求書_Detail)設定パネルが開きます。
Column Orderで「フォルダ」列を追加します。
エディタ右上の「Save」をクリックして保存します。
AppSheet からProjectを読み込んで関数を設定する
「Call a script」の設定をしましょう。
アプリエディタ左側メニュー「Automation」をクリックします。
Botsナビゲーションパネルで、(第1回)で作成した「Automation」ボットを選択します。
「Add a step」をクリックして、新しいステップを追加します。
ステップの名前をつけます。
「Step name」に「取引先別フォルダ管理 by GAS」と名前をつけました。
ステップを開いて、種類を「Run a task」にします。
エディタ画面右側に Settings ペインが開くので、「Call a script」ボタンをクリックして選択します。
Table nameは、タスクを実行するテーブルです。ここでは「請求書」を選択します。
Apps Script Projectは、GASプロジェクトのファイルを選択します。
書類アイコンをクリックします。
Select a fileで、先ほど作成したプロジェクトファイル「請求書Automation」を選択して「select」をクリックします。
Apps Script Projectに「請求書Automation」が読み込まれました。
続けて、Function Nameで実行する関数を選択します。
「transferFile (fileName, partnerName)」を選択します。
Function Nameで関数を選択すると、関数に設定されている引数がFunction Parametersとして表示されます。
2つの引数は、
- fileName:Excelの請求書ファイルのファイル名
- partnerName:取引先名
です。
これを式で設定します。入力フィールドをクリックして、Expression Assistantを表示します。
fileNameには以下の式をコピペします。
第2回のFile Name Prefix(ファイル名)で設定した式に、拡張子「.xlsx」を追加します。
1 |
[取引先].[取引先名] & "-" & TEXT([請求日], "yyyymmdd") & "-" & [トリガ] & ".xlsx" |
Expression Assistantに以下のようにコピペして「Save」します。
partnerNameには以下の式をコピペします。
1 |
[取引先].[取引先名] |
Expression Assistantに以下のようにコピペして「Save」します。
2つのFunction Parametersが設定されました。
Return ValueのトグルボタンをONにして有効にします。設定項目は、
- Return value:String
- Specific type:Url
を選択します。
最後に、[取引先別フォルダ管理 by GAS].[Output]という部分をコピペして保存しておきます。
Return Valueを設定する
「取引先別フォルダ管理 by GAS」タスクを実行すると、「取引先名」フォルダのURLが戻り値として取得できます。
このURLを「請求書」テーブルの「フォルダ」列に保存するためのステップを追加します。
「Add a step」をクリックして、新しいステップを追加します。
ステップの名前をつけます。
「Step name」に「フォルダURL」と名前をつけました。
ステップを開いて、種類を「Run a data action」にします。
エディタ画面右側に Settings ペインが開くので、「Set row values」ボタンをクリックして選択します。
Set these column(s)は、「フォルダ」を選択します。
「=」の入力フィールドをクリックして、式を設定します。
Expression Assistantが開きます。
「取引先別フォルダ管理 by GAS」タスクの「Return Value」のところで保存しておいた式をコピペします。
以上で、ステップの設定が完了しました。
4. AppSheetでCall a scriptを実行する
「Call a script」を実行してみましょう。
エディタ右側のプレビュー画面、タブメニュー「請求書」を選択します。
作成済みの請求書をひとつ選択します。
「請求書発行」ボタンをクリックするとボットが実行されるので、クリックしてみましょう。
アプリフォルダ(請求書-xxxxxxx)内の「Files」フォルダを確認してみます。
「取引先名」フォルダが作成されているでしょうか?
このフォルダをクリックして開いてみましょう。
「取引先名」フォルダの中に請求書ファイルが保存されていれば成功です。
アプリの請求書詳細ビュー(請求書_Detail」)見てみましょう。
「フォルダ」とそのURLが表示されているでしょうか?
クリックして、先ほど確認した「取引先名」フォルダが表示されたら成功です。
以下のように、AppSheetで発行した請求書を取引先別フォルダで管理できるようになります。
以上、「Call a script」タスクを使って、AppSheetとGASを連携しました。
今回解説したDriveサービスを使ったスクリプトは、GASのほんの一例です。
GASと連携することにより、AppSheetの機能拡張の可能性が飛躍的に広がります。
より高度で複雑なシステムを開発したくなったら、GASについて学習してみてください。
- 第1回 6つのTaskでできること
- 第2回「Create a new file」でファイルを作成する
- 第3回「Send an email」でメールを送信する
- 第4回「Call a webhook」でLINEにプッシュ通知する
- 第5回「Call a script」でAppSheetとGASを連携させる
- 第6回「Send a notification」でモバイルに通知する