前回までで、Google Cloud Functionsを利用して、すでにCloud Storageに配置してあるPDFについて、パスワード付PDFにして、再度Cloud Storageに格納するところまで成功しました。これで、Cloud Functions側にGASからの受け入れ窓口と、取得したデータをバイナリで返してくれさえすれば、Google Apps Script + Google Cloud Functionsの合わせ技で、パスワードPDFを一気につくれます。

ようやくこれで、5年越しに低価格で高速なパスワードPDFをGASから作る環境が作れました。Cloud FunctionsはGAS単体やGCP単体では難しい今回のようなケースで、Node.jsとモジュールの力を借りて、機能拡張するには非常に良い選択肢であると、検証できたと思います。

※これにてパスワードPDFは作れるようになりましたが、同じ要領で暗号化ZIPも作れるかもしれません。また、複数のユーザで使う場合には、ファイル名+シート名+日付といったようなファイル名を付けて処理をすると良いでしょう。

※また、この関数実行URLは知っていれば誰でも実行できてしまうので、課金でCloud死してしまいます。独自にAPIキー的なものを実装して、APIキーが無いアクセスは弾くようにしてしまえば良いでしょう。

今回使用するスプレッドシート

今回は単純に1枚だけ、PDF化するためだけのシートを加えています。スクリプトエディタの中にて、run_gcffunction関数を実行すると、GCFにパラメータを送り、パスワードPDFをバイナリで取得して、ドライブに生成します。もちろん、そのままメールに添付して送る事も可能です。

事前準備

Cloud Storage

今回の処理で必要な手順は以下の通り。

  1. Cloud Storage(バケットの名前は、drive2gcsにしておきました)に、フォルダ(publicという名前にしました)を作成する
  2. 今回は特にファイルはアップしません。

Cloud Storage側はこれだけです。

Cloud Functions

Cloud Functions側の準備もシンプルです。事前にサービスアカウントの作成が必要ですので、作成をしておきましょう。前回の記事で作成について触れています。もちろん請求先アカウントの設定も必要です。

  1. 関数を作成する
  2. 割当メモリは512MB、トリガーはHTTPとしました。ランタイムはNode.js V8を選んでいます。
  3. リージョンは、デフォルトのus-central1にしてあります。
  4. 関数名は、spreadmanという名前にしました。しかし、実際に呼び出す関数はコードの中にある「sspdfget」になりますので、注意。
  5. Cloud Functions上では、npmでインストールではなく、package.jsonに記述すると裏でモジュールを用意してくれます。ですので、以下のような記述を追加しました。追加モジュールは2個です。
  6. hummus-recipeは、PDFをパスワード付にするだけでなく、様々な加工のできるスグレモノです。
  7. google-cloud/storageは、Google作成のNode.jsからCloud Storageへのアクセスを容易にするモジュールです。
  8. 今回は、GCF側でスプレッドシートのPDF化を行わせるので、requestモジュールを追加しています。
  9. 実行する関数名は、sspdfgetとして設定しました。

図:package.jsonには以上のような記述を追加

ソースコード

GAS側コード

  • GCF側の関数実行用URL、スプレッドシートのID、ドライブのフォルダのIDなどを変数として入力しておきます。
  • GAS側でPDFは生成させないので、今回はGCF側関数にJSON形式でパラメータを渡してあげます。
  • その際に、Access Tokenも必要なので、ScriptApp.getOAuthToken()にて取得しておきましょう。
  • 必ず、POSTで送信します。UrlfetchApp1回だけでパス付PDFが作れるので、時間コストはこれまでのPDF生成と同じです。(GCFのお金は掛かるけれどね)
  • サーバレスポンスコードが200ならば、GCF側からパス付PDFのバイナリデータを受け取り、DriveAppのcreateFileメソッドにて、ファイルを生成します。

今回の開発で300回くらい実行していますが、果たしてコストどれくらいかかったのかな。多分GCF無料枠とGCPの無料枠で済んでいるはず!!

GCF側コード

実行してみる

コードを記述したら、

  1. メイン画面の一番下にある「デプロイ」をクリックする
  2. モジュールの準備やコードの精査などが開始されます。問題がある場合にはエラー表示がなされ、ログはStackDriver Loggingに記録されています。
  3. 完全に完了すると、待機する状態になります。
  4. 完全に完了したら、トリガーをクリックし、URLが表示されるのでこれを控えておいて、GAS側コードへ追記する。クリックしただけでは、今回は動作しません(パラメータが無いため)。
  5. 今回のプログラムでは、最後にパスワードPDFのバイナリファイルを返信しています。GAS側でこれを受けてPDFを生成しています。
  6. きちんと実行が完了すると、GCS側のバケット内にシート名_encrypt.pdfが生成されます(少し時間差があります)。
  7. 今回のコードではGCS側にもアップロードしていますが、API的な考えならば、GCSの部分は削除しても問題ありません。

図:encryptなPDFが生成されました。

図:Google Drive側にも生成されました。

関連リンク

共有してみる: