AppSheet Automationの使い方(5)「Call a script」でGASと連携

folder_openAppSheet

請求書アプリのユースケースで、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」というアイコンをクリックすると、新エディタと旧エディタの切り替えができます。
記事のアップデートができるまでは、とりあえず、旧エディタに切り替えて解説を読んでください。

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を呼び出して使うことができます。例えば、

  1. AppSheetからGoogle Workspaceのサービス(Gmail、スプレッドシート、ドライブなど)を操作する
  2. AppSheetからGASを経由して外部サービスと連携する
  3. AppSheet単体では難しい複雑な処理をGASで実行する

という使い方ができます。

AppSheetはノーコード開発ツールなので、エディタ画面で設定するだけでアプリが作れます。
しかし、AppSheetに用意されている設定以上のことはできないので、開発の自由度は制限されます。

それに対して、GASはスクリプトを書くことで比較的自由に機能を開発できます。
GASと連携することで、AppSheetでの開発がやりやすくなったり、機能拡張ができるようになります。

GASのイメージ

DriveサービスでGoogleドライブを操作する

今回は、「AppSheetで作成した請求書ファイルを取引先別フォルダで管理する」ことに挑戦します。
第2回で「Create a new file」を使って、Excelの請求書ファイルを作成しました。
このファイルはGoogleドライブ内のフォルダ(アプリフォルダ内の「Files」フォルダ)に保存されています。
「Call a script」を使って「取引先名」フォルダを作成し、請求書ファイルをこのフォルダに移動します。

以上のように、

  • Googleドライブにフォルダを作成する
  • Googleドライブにあるファイルを移動する

時に使うのが、GASのDriveサービスです。
Driveサービスを使えば、Googleドライブ内のフォルダやファイルを操作(追加、移動、削除など)できます。

「Call a script」で実行するDriveサービスの手順は以下の通りです。

  1. 「Files」フォルダ内に保存されている請求書ファイルを検索して、ファイルIDを取得する
  2. 「Files」フォルダ内に「取引先名」フォルダがあるか検索する
    • ある場合:フォルダIDを取得する
    • ない場合:「取引先名」フォルダを作成して、フォルダIDを取得する
  3. 請求書ファイルを「取引先名」フォルダに移動する
  4. 「取引先名」フォルダの共有URLを取得して、関数の戻り値にする。

このブログはAppSheetの解説ブログなので、GASの書き方やDriveサービスの使い方について詳細な解説は行いません。GASについて知識を深めたい場合は、以下のような専門書で学習してください。

 

2. GASのプロジェクトを作成する

AppSheetで請求書を保存しているフォルダIDを取得する

GASを書く前に、請求書ファイルを保存している「Files」フォルダのフォルダIDを取得しておきます。

Googleドライブ内の「AppSheet」フォルダをクリック、「data」フォルダをクリックして、その中にある「請求書-○○○○○○○」(○○○○○○○はowner's IDを含む文字列)がアプリフォルダです。

Googleドライブ内のアプリフォルダを開く。

アプリフォルダ内の「Files」フォルダをクリックして開きます。
請求書を未作成の場合は「Files」フォルダが存在しません。
第2回の記事を読んで請求書を作成するか、自分で追加してください。

アプリフォルダ内にFilesフォルダがある。

中に請求書ファイルが保存されています。
フォルダIDは、URL内のfolders以下、{ID}の部分です。
後で使うので、{ID}をコピーして保存しておいてください。

フォルダID

https://drive.google.com/drive/folders/{ID}

フォルダIDを取得する。

GASプロジェクトを作成する

では、GASのスクリプトを書いてみましょう。
はじめに、GASのプロジェクトを作成します。
Googleドライブの左上にある「新規」をクリックします。

Googleドライブに新規ファイルを作成する。

「その他」から「Google Apps Script」をクリックします。

Google Apps Scriptをクリックする。

GASのプロジェクトが作成されて、スクリプトエディタが開きます。
GASは、スクリプトエディタでスクリプトを書いたり、実行したりします。

プロジェクトの名前を付けます。
「無題のプロジェクト」をクリックします。

スクリプトエディタが開く。

「プロジェクト タイトル」にプロジェクトの名前を入力します。
ここでは、Botと同じ「請求書Automation」という名前にしました。

プロジェクトの名前を付ける。

スクリプトエディタでスクリプトを編集しましょう。
「Files」フォルダ内に「取引先名」フォルダを作成して、請求書ファイルを移動するためのスクリプトを以下のように書いてみました。
「フォルダID」の箇所に、先ほど保存しておいたフォルダIDをコピペします。

GASのスクリプトを編集する。

以下のスクリプトをスクリプトエディタにコピペして使えます。
「フォルダ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から渡すことができます。

transferFile関数と引数を定義した。

3〜4行目で「Files」のフォルダIDから、「Files」フォルダを取得しています。
5行目で、createFolder関数を実行して、「取引先名」フォルダを取得しています。
createFolder関数には2つの引数、folder(「Files」フォルダ)とpartnerName(取引先名)を設定します。

「Files」フォルダ、「取引先」フォルダを取得する。

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で受け取ることができます。

「取引先名」フォルダのURLを返却する。

スクリプトを実行してアクセス許可する

GASスクリプトを実際に使うためには、スクリプトがGoogleドライブにアクセスして、ファイル操作することを許可する必要があります。
そのために、完成したスクリプトを実行します。
スクリプトエディタの「実行」をクリックしてください。

GASスクリプトを実行する。

はじめてスクリプトを実行すると「承認が必要です」というダイアログが表示されます。
「権限を確認」をクリックします。

「権限を確認」をクリックする。

GASスクリプトを実行するGoogleアカウント(自分のGoogleアカウント)にログインします。
ログイン中のアカウントの場合はクリックするだけで、ログイン作業は必要ありません。

Googleアカウントにログインする。

「このアプリはGoogleで確認されていません」というダイアログが表示されます。
左下にある「詳細」をクリックします。

「このアプリはGoogleで確認されていません」というダイアログが表示される。

左下に「請求書Automation(安全ではないページ)に移動」というリンクが表示されるので、クリックします。

(安全ではないページ)に移動をクリックする。

「請求書AutomationがGoogleアカウントへのアクセスをリクエストしています」と表示されるので、「許可」をクリックします。

「許可」をクリックする。

「許可」をするとスクリプトが実行されます。
実行すると、スクリプトエディタの「実行ログ」に以下のようなエラーが表示されます。
これは、AppSheetから引数を渡す前提でスクリプトを書いているので、「引数がありません」というエラーです。
問題ないので、無視しても大丈夫です。

スクリプトが実行される。

3. Call a scriptを設定する

フォルダのURLを保存する列を追加する

GASプロジェクト「請求書Automation」を実行すると、「取引先名」フォルダのURLが戻り値として返ってきます。
AppSheetで受け取った戻り値を保存するために、「請求書」テーブルに列を追加しましょう。

AppSheetエディタ左側メニュー「Data」をクリック、「Tables」タブに移動して「請求書」テーブルをクリックして設定パネルを開きます。
「View source」をクリックして、データソースのGoogleスプレッドシートを開きます。

View sourceでデータソースのGoogleスプレッドシートを開く。

「請求書」シートを開いて、「フォルダ」列を追加します。

請求書シートにフォルダ列を追加する。

AppSheetエディタに戻ります。
左側メニュー「Data」をクリック、「Columns」タブに移動して「請求書」をクリックして列設定パネルを開きます。
「Regenerate Structure」をクリックします。

請求書の列設定パネルを開く。

「Regenerate」をクリックします。

Regenerateをクリックする。

「フォルダ」列が追加されるので、TYPEを「Url」に変更します。
画面右上の「Save」をクリックして保存することを忘れずに。

フォルダ列のTYPEをUrlに変更する。

請求書のViewも調整します。
AppSheetエディタのプレビューで「請求書」を選択し、作成済みの請求書をひとつ選択します。

プレビューで「請求書」を選択し、作成済みの請求書をひとつ選択する。

プレビュー画面の下にある「View: 請求書_Detail」のリンクをクリックします。

請求書_Detailを表示する。

「請求書_Detail」Viewの設定パネルが開きます。
Column Orderで「フォルダ」を追加します。

Column Orderで「フォルダ」を追加する。

AppSheetからProjectを読み込んで関数を設定する

「Call a script」の設定をしましょう。

AppSheetエディタ左側メニュー「Bot」をクリック、「Bots」タブに移動します。
第1回で作成したBot「請求書Automation」をクリックして開きます。

AppSheetエディタ左側メニュー「Bot」をクリック、「Bots」タブに移動、Botをクリックして開く。

「Add a step」をクリックして、新しいStepを追加します。

「Add a step」をクリックして、新しいStepを追加する。

Step(ステップ)の名前をつけます。
「Step name」に「取引先別フォルダ管理 by GAS」と名前をつけました。

Step(ステップ)の名前をつける。

Stepを開いて、種類を「Run a task」にします。

Stepの種類を「Run a task」にする。

「Tasks」タブに移動します。
さきほど追加した「取引先別フォルダ管理 by GAS Task - 1」というTaskがあると思うので、クリックして開きます。

「Tasks」タブに移動する。

はじめの項目を以下のように設定しました。

設定項目
Task category 「Call a script」を選択します。
Task name Taskの名前です。
Step名と同じ「取引先別フォルダ管理 by GAS」にしました。
Table name タスクを実行するテーブルです。ここでは「請求書」を選択します。

「Call a script」を設定する。

「Apps Script Project」は、GASプロジェクトのファイルを選択します。
書類アイコンをクリックします。

「GASプロジェクトのファイルを選択する。

Upload fromで「Google Drive Files」を選択します。

Upload fromで「Google Drive Files」を選択する。

先ほど作成したGASプロジェクトのファイル(請求書Automation)を選択して「select」をクリックします。

GASプロジェクトのファイルを選択する。

「Apps Script Project」に「請求書Automation」が読み込まれました。
続けて、「Function Name」で実行する関数を選択します。

GASプロジェクトが読み込まれる。

「transferFile (fileName, partnerName)」を選択します。

transferFileを選択する。

「Function Name」で関数を選択すると、関数に設定されている引数が「Function Parameters」として表示されます。
2つの引数は、

  • fileName:Excelの請求書ファイルのファイル名
  • partnerName:取引先名

です。
これを式で設定します。三角フラスコアイコンをクリックして、Expression Assistantを表示します。

引数を設定する。

「fileName」は以下のように設定します。
第2回の「File Name Prefix」(ファイル名)で設定した式に、拡張子「.xlsx」を追加します。

fileNameを式で設定する。

「partnerName」は以下のように設定します。

partnerNameを式で設定する。

2つの「Function Parameters」が設定されました。

引数が設定された。

「Return Value」のトグルボタンをONにして有効にします。設定項目は、

  • Return value type:「String」
  • Specific type:「Url」

を選択します。
最後に、[取引先別フォルダ管理 by GAS].[Output]という部分をコピペして保存しておきます。

「Return Value」を設定する。

Return Valueを設定する

「取引先別フォルダ管理 by GAS」Taskを実行すると、「取引先名」フォルダのURLが戻り値として取得できます。
このURLを「請求書」テーブルの「フォルダ」列に保存するためのActionを追加します。

「Bots」タブに移動して、「請求書Automation」BotにStepをひとつ追加します。

Stepを追加する。

Step(ステップ)の名前をつけます。
「Step name」に「フォルダURL」と名前をつけました。

Step(ステップ)の名前をつける。

Stepを開いて、種類を「Run a data action」にします。

Stepの種類を「Run a data action」にする。

画面右側にAction設定用の「Setting」パネルが表示されるので「Set row values」を選択します。
Set these column(s)は、「フォルダ」を選択します。
三角フラスコアイコンをクリックして、式を設定します。

「Run a data action」を設定する。

Expression Assistantに以下のように式を設定します。
「取引先別フォルダ管理 by GAS」Taskの「Return Value」のところで保存しておいた式をコピペします。

「Return Value」の式をコピペする。

Actionの設定が完了しました。

Actionの設定が完了する。

4. AppSheetでCall a scriptを実行する

「Call a script」を実行してみましょう。
AppSheetエディタのプレビューで「請求書」を選択し、作成済みの請求書をひとつ選択します。

「Call a script」を実行する。

「請求書発行」ボタンをクリックするとBotが実行されるので、クリックしてみましょう。

Botを実行する。

「Files」フォルダを確認してみます。
「取引先名」フォルダ(新日本フロンティア株式会社)が作成されているでしょうか?
このフォルダをクリックして開いてみましょう。

「取引先名」フォルダが作成された。

「取引先名」フォルダの中に請求書ファイルが保存されていれば成功です。

「取引先名」フォルダの中に請求書が移動している。

アプリの「請求書_Detail」Viewを見てみましょう。
「フォルダ」とそのURLが表示されているでしょうか?
クリックすると、フォルダを開いて請求書を表示できるようになります。

「取引先名」フォルダのURLが表示される。

成功すれば、以下のようにAppSheetで発行した請求書を取引先別フォルダで管理できるようになります。

AppSheetで発行した請求書を取引先別フォルダで管理できる。

以上、「Call a script」Taskを使って、AppSheetとGASを連携しました。
今回解説したDriveサービスを使ったスクリプトは、GASのほんの一例です。
GASと連携することにより、AppSheetの機能拡張の可能性が飛躍的に広がります。
より高度で複雑なシステムを開発したくなったら、GASについて学習してみてください!

Share Me!

前の投稿
AppSheet Automationの使い方(6)「Send a notification」で通知
次の投稿
AppSheet Automationの使い方(4)「Call a webhook」でLINEに通知

関連記事

メニュー