3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Workspace Studio のカスタムステップ 〜 Google Apps Script による機能拡張 〜

Last updated at Posted at 2025-12-04

はじめに

この記事は、MBS 毎日放送のテックブログで公開した内容からの抜粋になります。
サンプルコードなど詳細は MBS Tech Nexus ブログをご参照ください。

こんにちは Workspace Studio

2025年4月の Google Cloud Next 2025で発表され、大きな話題を呼んだ「 Google Workspace Flows 」。発表から約7ヶ月を経て、ついに「Workspace Studio」となり利用可能になりました。

Workspace Studio と Google Apps Script

Workspace Studio は、Google Workspace ( Forms, Drive, Chat, Gmail 等 ) の操作をトリガーに、一連の業務プロセスを自動化するツールです。これまでも、Google Apps Script(以下 GAS) のトリガーや AppSheet の Automation などで同様のことは実現できましたが、Workspace Studio の特徴は、コードを書かずにGUI でフローを視覚的に構築できる点にあります。 これにより、いわゆる「市民開発者」でも業務自動化に着手しやすくなることが期待されています。 また、Asana、Mailchimp、Salesforce といったサードパーティーのサービスとのコネクタも用意されており、今後も拡充していくとのことです。

そう、「ノーコードで AI の力を使って日々の業務を自動化できる。」 これこそが Workspace Studio の最大の利点のはず。ですが、 Workspace Studio の標準機能にない部分を補完する 『カスタムステップ』 という魔改造の扉が待っているのです。

カスタムステップを利用すると、GAS 書いたコードをワークフローの中に自由に取り入れることができます。今回は、Workspace Studio の基本のから一歩踏み込んだワークフローを構築していきます。

Gemini と GAS で「カスタムステップ」を開発する

ノーコードでワークフローを実現する Workspace Studio の裏の顔、 GAS で自作できる「カスタムステップ」を用いて、「ノーコードではできないこと」を盛り込んだシナリオに挑戦しました。

シナリオ :

これまで:フォームで社内表彰の申請をすると、申請内容を担当者に Chat で送信するフローを Workspace Studio で自動化。

これから:フォームで社内表彰の申請をすると、 カスタム Gem で申請理由を基に正式な「表彰文」を作成。 GAS がその表彰文を使ってスライドから「表彰状画像」を動的に生成し、 Chat に Webhook でリッチなカード通知を送る

最終的な処理フロー

STEP 1 : トリガー(Google Forms)の準備

Workspace Studio に渡すためのデータ(名前・理由)を受け取るシンプルなフォームを用意します。

  • 質問1: 表彰者の名前 (Name) - 記述式
  • 質問2: 表彰理由 (Reason) - 記述式(箇条書きでOK、など)

STEP 2 : カスタム Gem の準備

フォームから送られた簡単な「表彰理由」を元に「表彰分」を作成するカスタム Gem を Gemini アプリで作成します。

STEP 3 : GAS カスタムステップの実装

ここが今回の記事の核となる部分です。 GAS を Workspace Studio の「ステップ」として認識させるには、特定のお作法に従う必要があります。

1. マニフェストファイル (appsscript.json)

最も重要なのがマニフェストファイルです。 addOns.flows.workflowElements を定義することで、自作の GAS が Workspace Studio の GUI に表示されるようになります。

{
  "timeZone": "Asia/Tokyo",
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "oauthScopes": \[
    "https://www.googleapis.com/auth/presentations",
    "https://www.googleapis.com/auth/drive",
    "https://www.googleapis.com/auth/script.external_request",
    "https://www.googleapis.com/auth/script.locale"
  \],
  "addOns": {
    "common": {
      "name": "MBS Tech Nexus Tools",
      "logoUrl": "https://www.gstatic.com/images/branding/product/1x/googleg_48dp.png",
      "useLocaleFromApp": true
    },
    "flows": {
      "workflowElements": \[
        {
          "id": "generateCertificate",
          "state": "ACTIVE",
          "name": "表彰状を作成 (Generate Certificate)",
          "description": "スライドテンプレートから表彰状画像を生成します。",
          "workflowAction": {
            "inputs": \[
              {
                "id": "name",
                "description": "表彰者の名前 (Recipient's Name)",
                "cardinality": "SINGLE",
                "dataType": {
                  "basicType": "STRING"
                }
              },
              {
                "id": "reason",
                "description": "表彰理由 (Reason for Award)",
                "cardinality": "SINGLE",
                "dataType": {
                  "basicType": "STRING"
                }
              }
            \],
            "outputs": \[
              {
                "id": "fileId",
                "description": "生成された画像のID (Generated Image ID)",
                "cardinality": "SINGLE",
                "dataType": {
                  "basicType": "STRING"
                }
              },
              {
                "id": "generatedAt",
                "description": "生成日時 (Timestamp of Generation)",
                "cardinality": "SINGLE",
                "dataType": {
                  "basicType": "STRING"
                }
              }
            \],
            "onConfigFunction": "configureCertificateStep",
            "onExecuteFunction": "generateCertificateStep"
          }
        }
      \]
    }
  }
}  

ポイント :

  • カスタムステップ開発の最大の特徴でありポイントは、このマニフェストファイル にあります。
  • inputs / outputs: ここで、このステップが Workspace Studio から受け取る変数(name, reason)と、Workspace Studio に返す変数( File ID )を明確に定義します。
  • onConfigFunction: Workspace Studio のエディタ上で、ユーザーが設定(変数のマッピング)を行うための設定画面( UI )を生成する関数( configureCertificateStep )を指定します。
  • onExecuteFunction: フローが実行された時に、実際にロジック(画像生成など)を動かす実行関数( generateCertificateStep )を指定します。

このように、GAS 側で「入出力」「設定 UI 」「実行ロジック」の3つを紐付けて定義しておくことで、Workspace Studio 側はこれを一つの独立した「部品(ステップ)」として扱えるようになるのです。

2. GASコード ( certificate_flow.gs )

appsscript.json で指定した関数を実装します。

コードのポイント:

  • generateCertificateStep: メインの処理関数。 event.workflow.actionInvocation.inputs で入力値を受け取り、画像生成後、AddOnsResponseService を使って File ID を返します。
  • configureCertificateStep: 設定 UI を JSON で定義します。 hostAppDataSource を使うことで、Workspace Studio の変数をマッピングできる入力欄になります。

3. カスタムステップのデプロイ

コードが完成したら、Workspace Studio から認識させるために「デプロイ」が必要です。
(今回はアルファ版の検証として「テストデプロイ」機能を使います。)

  • GAS エディタの上部にある「 デプロイ > デプロイをテスト 」を選択します。

  • インストール 」をクリックします。

    STEP 4: Chat Webhook の設定

    GAS から返ってきた File ID を Chat に Webhook で通知します。

    • まず、通知を送りたい Google Chat のスペースを開き、「スペースの設定」から「アプリと統合」を選択し、「 Webhook を管理」から新しい Webhook URL を作成・コピーしておきます。

    STEP 5: Workspace Studio 側での組み立て

    GAS をデプロイ(テストデプロイ)すると、Workspace Studio のエディタの「ステップを追加」メニューに、自作の「表彰状を作成 ( Generate Certificate )」が表示されるようになります。

    • Starter(トリガー)に Google Forms "When a form response comes in" を選択。参照するフォームを指定。
    • Actions に "Ask a Gem" を追加。Step 2 で作成した Gem を指定。フォームの「表彰理由」を渡す。
    • 「表彰状を作成」ステップを追加。
    • 設定画面で、フォームからの「表彰者」Gem の出力の「表彰文」 を関数の引数としてマッピングします。
    • "Send a webhook" ステップを追加します。

(実行結果 :)

まとめ

Workspace Studio は、ノーコードの GUI による手軽さと、GAS による高度な拡張性を併せ持つ、非常に強力なプラットフォームだと感じました。

ノーコードか、 GAS による高度なワークフローか、それが問題だ。

MBS 毎日放送の有志によるIT勉強会 Tech Nexus では放送局エンジニアが考えていることを背伸びせずに発信していく、MBS Tech Nexus ブログ をやっています。

thumbnail

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?