Google AppsheetでスプレッドシートのデータからPDFファイル出力しメールに添付する機能を開発してみた

はじめに

この記事の筆者の私は、2017年よりベトナムから日本へ来て、2018年ハイペリオンに入社しました。
テスターとしてのキャリアを開始し、単体テスト、結合テスト、総合テストを一通り経験。
品質保証計画プロジェクトへメンバーとして参加するなど、品質管理のエキスパートとして経験を重ねてきました。
そして、今回社内の技術検証でGoogle Appsheetというノーコードツールを試しました。

開発の目的

社内の他部署業務のシステム化

検証内容・結果

検証内容

Google Appsheetで下記機能の開発が可能か

① GoogleスプレッドシートからPDF出力する機能(スプレッドシート上の情報から契約書を自動作成・PDF化)
② メールの自動作成・送信する機能(①のPDFを送信するメール内容テンプレート自動作成/下書き保存・送信)

検証結果

検証内容の①②について、いずれも開発が可能。

前回は「① GoogleスプレッドシートからPDFを出力する機能の開発」を紹介しました。
今回は「①GoogleスプレッドシートからPDFを出力する機能」と、「②メールの自動作成・送信機能」の組み合わせ開発方法と統一化の結果、開発時点で見つけた問題について、ご紹介します。

開発機能のご紹介

画面遷移図

統一化されるアプリでは、見積書だけではなく、注文書も出力できるようになるため、処理を追加。
オーダー関連の画面で見積書・注文書を発行するとき、テンプレートに基づいた相応のPDFファイルと下書きメールを自動で作成し、作成したPDFファイルを自動でメールに添付する。
作成された下書きメールの確認が可能。
自動送信の機能も開発可能ではあるが、今回はあえて下書き作成までにとどめている。(送信前に内容を再確認したい為)
※ファイル出力とメール管理(作成・送信)の部分は、以前の記事に紹介しております。詳細は下記をご参考ください。

Google AppsheetでスプレッドシートのデータからPDFファイルを出力してみた
Google Appsheetでメール作成・送信アプリを開発してみた

開発の流れご紹介

ステップ1

メールの添付を管理するために、「メール」テーブルに「ファイルアドレス」カラムを追加する。

ステップ2

見積書発行の処理には、画面のボタンをクリックするとき、ファイル作成の処理のみではなく、下書きメール作成の処理も含んでおり、2つ別の処理になる。
各処理が相応の隠れた子Actionを作成し、メインActionで、子Actionと処理の順番に紐づけ、画面で表示するボタンと連結する。(前回、見積書ファイル作成のActionを作成したので、そのActionがHideを設定し、メインActionで子Actionとして紐づける。)
※ファイル作成はクライアントの方ではなく、サーバーサイドの処理なので、
 ファイルを作成するためのActionはフラグを設定し、後で作成するBotを呼んで処理する。
下書きメール作成するためのActionには(Botで作成された)、添付ファイルの保存場所も指定する。

ステップ3

注文書発行の処理は、見積書発行の処理と大体同様のActionを作成し、設定する。
※注文書のファイルアドレスが見積書のファイルアドレスと異なるのでご注意ください。

ステップ4

Bot・オートメーションで見積書ファイル作成処理のTrigger(トリガー:いつにする)とProcess(プロセス:なにをする)を設定する。

注文書ファイル作成のBot・オートメーションは、前回説明した見積書ファイル作成のBotと同様に設定する。
※注文書のテンプレートファイルと管理フラグが見積書と異なるのでご注意ください。
また、下書きメールにファイルを添付、画面でファイル確認するときは、Botで指定された場所を使用しファイルを開くので、保存場所はデフォルトファイルアドレスを設定するのがオススメ。

ステップ5

メール作成するBotで、添付ファイルのアドレスを設定する。

開発するときに発生した問題

ファイル作成して出力されたファイルが要求とマッチングすることが一番大切だが、Appsheetでファイルのレイアウト・フォーマットの管理はしづらいこと。

問題1:ファイルを出力できない

問題

ファイルを出力できない。

原因

複数の原因がありそうだが、よくある原因はGoogle Appsheetが使っているテンプレートファイルをサポートしない又は読めないこと。

解決方法

ロカールでテンプレートファイルを準備し、Google Driveにアップロードしないで、オンラインでGoogle Docsのドキュメントタイプを直接的に作成するのがオススメ。
また、テンプレートファイルを作成し、Botに指定した後、「View」で開いてみて、「Test」でファイル出力機能を確認してみてね!

問題2:ブレイク・レイアウト

問題

テンプレートに項目の場所を丁寧に設定するが、出力結果ファイル項目のレイアウトがズレてしまう。

原因

ファイル出力するときに、スペーシングやパラグラフなどフォーマットの構造変更あり。

解決方法

ファイルの内容・項目は、全てテーブルの中に設定するのがオススメ。

問題3:テーブル・ボーダーが未表示

問題

テンプレートにテーブルのボーダーを丁寧に設定するが、出力結果ファイルにはテーブルのボーダーが一部表示されない。

原因

Google AppsheetはPDFファイルを出力するとき、Google DocsテンプレートからPDFファイルに変換するので、テーブルに複雑な構造があるなら、変換できない又は間違って変換する問題が発生することがある。

解決方法

Google Appsheetの不具合なので、まだ効果的な解決策はない。

問題4:重複キーを登録される

問題

キーを自動連番で設定するなら、重複番号の登録が発生する。

原因

オンラインとオフライン状態の両方で処理を実行できるために、Google Appsheetがデータベースとリアルタイムでやり取りしない。
そのため、自動連番のキーを使う場合、オンラインとオフライン状態で同時に同じテーブルで登録処理があるなら、同期化・Syncすると同じキーを重複としてDBに反映される。

解決方法

キーが(伝統的なDBと同様に)自動連番を設定しない、ユニーク文字ストリングを設定するのがオススメ。

問題5:複数Actionの間で次のActionを待つ時間がない

問題

複数Actionを一緒に呼んで、1つずつ連続に処理するとき、1つ目のActionがまだ完全に完了していないうちに次のActionを呼んで処理してしまう。

原因

複数Actionの間で次のActionを待つ時間がない。

解決方法

Google Appsheetがオンラインとオフライン状態の両方にActionを呼んで、処理することができるために非同期の仕組みを使用しているので、Actionで待ちの処理がサポートされない。
つまり、この問題の解決方法がない。複数Actionが互いに関連があるなら、Actionの設定にご注意ください。
※Botの処理なら待ちのプロセスがあるが、各Botは(トリガーで指定される)個別テーブルのデータのみ操作できるので、他のテーブルのデータは操作できないよ。

その他:Google Appsheetの問題/限界

  • Google AppsheetのテンプレートファイルはGoogle Docsのドキュメントを使用するので、テーブルのボーダーが二重線をまだ設定できない。
  • Google Appsheetは、現時点、Google Docsのドキュメントのテンプレートからのみファイルを変換し出力しているため、スプレッドシートなどテンプレートファイルはまだサポートされていない。
  • Google Appsheetで出力ファイルはPDFやCSV、HTMLやXMLなどのタイプだけサポートされているため、DOCXやPPTXなどファイルはまだ出力できていない。
  • Google AppsheetでActionがクライアントのサイドで実行し、Botがサーバーのサイドで実行するので、Actionがフラグの設定通りBotを呼べるが、Botの中でActionを呼べない。
  • ボタンが多い場合は、画面で見えなくなる部分が発生する問題があり、重なって表示されるリンク/ボタンがクリックできなくなる。※
  • 定義済み、固定設定になるので、画面レイアウトや項目位置など自由に調整できない。
  • 複雑なレイアウトがある印刷テンプレートの場合は、テンプレート準備が難しい。

※下記は「ボタンが多い場合は、画面で見えなくなる部分が発生する問題があり、重なって表示されるリンク/ボタンがクリックできなくなる」についての参考画像です。

まとめ

Appsheetを使うなら、開発経験がなくても、自身で簡単にアプリを作成できます。
複数のテンプレートとサンプル機能があって、直ぐに使用できるし、便利なアプリを開発できます。
また、強いサポートがあって、熱心な専門家とコンミュニティの人からアドバイスをくれるのができますよ。
しかし、Appsheetはまだ発展中の開発プラットフォームですので、またできないことがあって、開発するときに問題も見つけるかもしれません。
ですが、問題や不具合など発生したならAppsheetの開発チームも連絡し、相談と調査の過程から未来のバージョンで修正ができます。これはコンミュニティに有用な貢献する方法ですね。