請求書アプリのユースケースで、AppSheet AutomationのTask(タスク)設定をマスターします。
前回(第4回)は、「Call a webhook」Taskを設定してLINEにプッシュ通知をしてみました。
今回は、「Call a script」Taskを設定して、AppSheetとGASを連携させます。
Driveサービスを使ってGoogleドライブにフォルダを作成したり、ファイルを移動してみましょう。
この記事で使用する請求書アプリは、ブログで解説している請求書アプリ(7回シリーズ)です。
ブログを読んでアプリを自作していない場合は、メルマガ購読者特典のサンプルアプリをダウンロードしても大丈夫です。
【お知らせ】
2022年10月以降、AppSheetエディタの画面が新しく変更されています。
AppSheetのアップデートが速すぎて(汗)、このブログ記事はまだ新エディタの画面には対応していません。
エディタ画面右上にある「Switch to the legacy editor」というアイコンをクリックすると、新エディタと旧エディタの切り替えができます。
記事のアップデートができるまでは、とりあえず、旧エディタに切り替えて解説を読んでください。
目次
1. AppSheetで発行した請求書を取引先別フォルダで管理する
GAS(Google Apps Script)とは
今回は、AppSheetとGASを連携させます。
GAS(Google Apps Script)とは、Googleが提供するプログラミング言語です。
GASで書かれたプログラムのことを「スクリプト」(台本・脚本の意味)と呼びます。
AppSheetでは、Taskで「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の請求書ファイルを作成しました。
このファイルはGoogleドライブ内のフォルダ(アプリフォルダ内の「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」フォルダをクリックして、その中にある「請求書-○○○○○○○」(○○○○○○○はowner's IDを含む文字列)がアプリフォルダです。
アプリフォルダ内の「Files」フォルダをクリックして開きます。
請求書を未作成の場合は「Files」フォルダが存在しません。
第2回の記事を読んで請求書を作成するか、自分で追加してください。
中に請求書ファイルが保存されています。
フォルダIDは、URL内のfolders以下、{ID}の部分です。
後で使うので、{ID}をコピーして保存しておいてください。
https://drive.google.com/drive/folders/{ID}
GASプロジェクトを作成する
では、GASのスクリプトを書いてみましょう。
はじめに、GASのプロジェクトを作成します。
Googleドライブの左上にある「新規」をクリックします。
「その他」から「Google Apps Script」をクリックします。
GASのプロジェクトが作成されて、スクリプトエディタが開きます。
GASは、スクリプトエディタでスクリプトを書いたり、実行したりします。
プロジェクトの名前を付けます。
「無題のプロジェクト」をクリックします。
「プロジェクト タイトル」にプロジェクトの名前を入力します。
ここでは、Botと同じ「請求書Automation」という名前にしました。
スクリプトエディタでスクリプトを編集しましょう。
「Files」フォルダ内に「取引先名」フォルダを作成して、請求書ファイルを移動するためのスクリプトを以下のように書いてみました。
「フォルダID」の箇所に、先ほど保存しておいたフォルダIDをコピペします。
以下のスクリプトをスクリプトエディタにコピペして使えます。
「フォルダID」の箇所を、自分のフォルダIDに置き換えます。
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を保存する列を追加する
GASプロジェクト「請求書Automation」を実行すると、「取引先名」フォルダのURLが戻り値として返ってきます。
AppSheetで受け取った戻り値を保存するために、「請求書」テーブルに列を追加しましょう。
AppSheetエディタ左側メニュー「Data」をクリック、「Tables」タブに移動して「請求書」テーブルをクリックして設定パネルを開きます。
「View source」をクリックして、データソースのGoogleスプレッドシートを開きます。
「請求書」シートを開いて、「フォルダ」列を追加します。
AppSheetエディタに戻ります。
左側メニュー「Data」をクリック、「Columns」タブに移動して「請求書」をクリックして列設定パネルを開きます。
「Regenerate Structure」をクリックします。
「Regenerate」をクリックします。
「フォルダ」列が追加されるので、TYPEを「Url」に変更します。
画面右上の「Save」をクリックして保存することを忘れずに。
請求書のViewも調整します。
AppSheetエディタのプレビューで「請求書」を選択し、作成済みの請求書をひとつ選択します。
プレビュー画面の下にある「View: 請求書_Detail」のリンクをクリックします。
「請求書_Detail」Viewの設定パネルが開きます。
Column Orderで「フォルダ」を追加します。
AppSheetからProjectを読み込んで関数を設定する
「Call a script」の設定をしましょう。
AppSheetエディタ左側メニュー「Bot」をクリック、「Bots」タブに移動します。
第1回で作成したBot「請求書Automation」をクリックして開きます。
「Add a step」をクリックして、新しいStepを追加します。
Step(ステップ)の名前をつけます。
「Step name」に「取引先別フォルダ管理 by GAS」と名前をつけました。
Stepを開いて、種類を「Run a task」にします。
「Tasks」タブに移動します。
さきほど追加した「取引先別フォルダ管理 by GAS Task - 1」というTaskがあると思うので、クリックして開きます。
はじめの項目を以下のように設定しました。
設定項目 | 値 |
---|---|
Task category | 「Call a script」を選択します。 |
Task name | Taskの名前です。 Step名と同じ「取引先別フォルダ管理 by GAS」にしました。 |
Table name | タスクを実行するテーブルです。ここでは「請求書」を選択します。 |
「Apps Script Project」は、GASプロジェクトのファイルを選択します。
書類アイコンをクリックします。
Upload fromで「Google Drive Files」を選択します。
先ほど作成したGASプロジェクトのファイル(請求書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」を追加します。
「partnerName」は以下のように設定します。
2つの「Function Parameters」が設定されました。
「Return Value」のトグルボタンをONにして有効にします。設定項目は、
- Return value type:「String」
- Specific type:「Url」
を選択します。
最後に、[取引先別フォルダ管理 by GAS].[Output]という部分をコピペして保存しておきます。
Return Valueを設定する
「取引先別フォルダ管理 by GAS」Taskを実行すると、「取引先名」フォルダのURLが戻り値として取得できます。
このURLを「請求書」テーブルの「フォルダ」列に保存するためのActionを追加します。
「Bots」タブに移動して、「請求書Automation」BotにStepをひとつ追加します。
Step(ステップ)の名前をつけます。
「Step name」に「フォルダURL」と名前をつけました。
Stepを開いて、種類を「Run a data action」にします。
画面右側にAction設定用の「Setting」パネルが表示されるので「Set row values」を選択します。
Set these column(s)は、「フォルダ」を選択します。
三角フラスコアイコンをクリックして、式を設定します。
Expression Assistantに以下のように式を設定します。
「取引先別フォルダ管理 by GAS」Taskの「Return Value」のところで保存しておいた式をコピペします。
Actionの設定が完了しました。
4. AppSheetでCall a scriptを実行する
「Call a script」を実行してみましょう。
AppSheetエディタのプレビューで「請求書」を選択し、作成済みの請求書をひとつ選択します。
「請求書発行」ボタンをクリックするとBotが実行されるので、クリックしてみましょう。
「Files」フォルダを確認してみます。
「取引先名」フォルダ(新日本フロンティア株式会社)が作成されているでしょうか?
このフォルダをクリックして開いてみましょう。
「取引先名」フォルダの中に請求書ファイルが保存されていれば成功です。
アプリの「請求書_Detail」Viewを見てみましょう。
「フォルダ」とそのURLが表示されているでしょうか?
クリックすると、フォルダを開いて請求書を表示できるようになります。
成功すれば、以下のようにAppSheetで発行した請求書を取引先別フォルダで管理できるようになります。
以上、「Call a script」Taskを使って、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」でモバイルに通知する