BIGLOBE では生産性ツールに Google Workspace を使っています。 最近、Google Chat や Gmail の画面に見慣れないアイコン(下の画像の赤丸部分)が増えたことにお気付きでしょうか?

「これは何だ?」と思っていた方も多いかもしれません。その正体は「Workspace Studio」。Google Workspace の新しい自動化機能です。
この記事では、Workspace Studio の概要から、実際に Google Apps Script を使って「かゆい所に手が届く」自作アクションを開発するまでのプロセスを、試行錯誤の様子も含めてご紹介します。
なお、記事内で解説するスクリプトの完成版コードは記事の末尾にまとめて掲載しています。読み進める際はコードの全体像を気にせず、実装の流れを楽しんでいただければと思います。
2025/12/4 追記: プロダクト名がWorkspace FlowsからWorkspace Studioに変更されました。一部、古い記述が残っていますがご容赦ください。
workspaceupdates.googleblog.com
- Workspace Studio とは?
- テンプレートだけでは手が届かない「メンバー追加」の壁
- Step 1. まずは Apps Script 単体で Chat API を試す
- Step 2. Studio のアクションとして実装する(まずは基本形)
- Step 3. Google Workspace の力を解き放つ(オートコンプリート実装)
- まとめ
- 付録 1:本記事の完成版コード
- 付録 2:JSONでUIを定義する
- 付録 3:トラブルシューティング・ガイド
- Q1. 実行するとエラーログに ReferenceError: Chat is not defined と表示される
- Q2. 承認画面で「権限を確認」へ進んだ後、「アクセスをブロック: 認証エラーです Some requested scopes cannot be shown: [https://www.googleapis.com/auth/chat.app.spaces]」と表示される
- Q3. 実行すると GoogleJsonResponseException: API call to chat.spaces.members.create failed with error: Google Chat API has not been used in project ... というエラーが表示される
- Q4. 実行すると GoogleJsonResponseException: API call to chat.spaces.members.create failed with error: Google Chat app not found. というエラーが表示される
AI活用チームの高玉です。Google Workspaceの新機能、Workspace Studio を拡張して業務を楽にしてみました。
Workspace Studio とは?
一言でいうと、「Google Workspace 上の面倒な定型作業を自動化してくれるすごい機能」です。
Workspace Studio では、自動化のプロセス全体を「Agent(エージェント)」または「Flow(フロー)」と呼びます。 Agent は、何かのきっかけで処理を開始する「Starter(スターター)」と、実際に行われる一連の処理である「Actions(アクション)」で構成されます。
- Starter: 「毎日朝 9 時に」「メールを受信したら」「Google フォームが送信されたら」など
- Actions: 「メールを送る」「Chat に投稿する」「Gemini で要約する」など
これらをノーコードでパズルのようにつなぎ合わせるだけで、業務を自動化できます。 特に、途中に Gemini や Gem を挟み込んで、生成 AI を使った要約や情報抽出ができるのが大きな特徴です。
テンプレートだけでは手が届かない「メンバー追加」の壁
さて、ここからが本題です。
私は社内で「LT 大会(ライトニングトーク大会)」などの勉強会を運営しているのですが、参加登録フローで一つ悩みがありました。
- やりたいこと:
- Google フォームで「参加登録」があったら、その人を「勉強会参加者用の Chat スペース」に自動的に招待(追加)したい。
Workspace Studio には「Google フォームの回答を受信時(Starter)」や「Chat にメッセージを投稿(Action)」という機能が標準で用意されています。 しかし、肝心の「指定したスペースにメンバーを追加する」というアクションが現時点では存在しません。
そこで、カスタムステップ(自作アクション)を作って解決することにしました。
Step 1. まずは Apps Script 単体で Chat API を試す
いきなり Workspace Studio のアクションを作りはじめる前に、まずは Apps Script 単体で「Chat API を使ってメンバーを追加できるか」を検証してみます。
1. 事前準備(Google Cloud プロジェクトの準備、API 有効化など)
Apps Script から Google Chat API を利用するには事前準備が必要です。初めて使う方は、以前に書いた記事「Apps Script ではじめる🤖Google Chat アプリ開発ガイド(ユーザー認証編)」を参考にしてください。
全部で7つの手順が必要になります。Chat API はここが一番厄介ですね。作業漏れがあった場合に備えて、この記事の末尾に「トラブルシューティング・ガイド」を掲載しておきます。エラーが出た場合はそちらを参照してください。
- 作業 1. Google Cloud プロジェクトの作成
- 作業 2. Chat API の有効化
- 作業 3. OAuth 同意画面の構成
- 作業 4. Google Chat API の設定
- 作業 5. Google Apps Scriptを新規作成しプロジェクトの設定を変更する
- 作業 6. appsscript.json に oauthScopes を追加
- 作業 7. 高度なチャットサービスをスクリプトエディターで追加
なお、手順 6 の appsscript.json の oauthScopes ですが、Chat.Spaces.Members.create() を使うので、https://www.googleapis.com/auth/chat.memberships が必要になります。
{ "timeZone": "Asia/Tokyo", "dependencies": { "enabledAdvancedServices": [ { "userSymbol": "Chat", "version": "v1", "serviceId": "chat" } ] }, "exceptionLogging": "STACKDRIVER", "runtimeVersion": "V8", "oauthScopes": [ "https://www.googleapis.com/auth/chat.memberships" ] }
2. 実験コードを書く
まずはハードコードで動かしてみます。 公式ドキュメント「ユーザー、Google グループ、Google Chat アプリをスペースに招待または追加する」を参考に、次のようなコードを書きました。
なお、スペース ID は、Chat の URL https://mail.google.com/chat/.../space/AAAA... とは異なり、「s」がついている(spaces/AAAA...)ので注意してください。
/** * 実験用コード:指定したスペースに自分を追加してみる */ function testAddMember() { // 1. 追加先のスペースID // ブラウザのURLバーを確認し、"space/AAAA..." の部分を "spaces/AAAA..." に書き換えて設定します。 const spaceId = 'spaces/AAAAxxxxxxxx'; // 2. 追加したいメンバーのID (今回は自分のメールアドレス) const userEmail = 'my-email@example.com'; const payload = { member: { name: `users/${userEmail}`, // Chat API は 'users/{email}' 形式を要求する type: 'HUMAN' } }; try { // Chat サービスの Spaces.Members.create メソッドを呼び出し const result = Chat.Spaces.Members.create(payload, spaceId); console.log('成功!メンバーを追加しました:', result); } catch (e) { console.error('失敗...', e); } }
指定したスペースに指定したメンバーを追加する関数ですが、今回はすでに参加済みのスペースに自分自身を追加します。なので動作結果に変わりはありませんが、API 呼び出しが成功するかどうかを確かめられます。
3. 実行してみる
この関数を実行すると、実行ログに次のように表示されます。
成功!メンバーを追加しました: { name: 'spaces/***********/members/*********************',
state: 'JOINED',
member:
{ isAnonymous: true,
name: 'users/*********************',
type: 'HUMAN' },
role: 'ROLE_MEMBER' }
無事に Chat API の呼び出しが成功しました。もしエラーが表示される場合は、後述するトラブルシューティングをご覧ください。
これで「Apps Script から Chat API を呼び出してメンバー追加ができる」という確証が得られました。あとはこれを Workspace Studio のアクションに組み込むだけです。
Step 2. Studio のアクションとして実装する(まずは基本形)
実験でうまくいったロジックを、Workspace Studio から呼び出せる形にします。
Workspace Studio の拡張方法(Apps Script でのアクション作成)については、公式ドキュメント「Google Workspace Studio を拡張する」に詳細がまとまっています。
重要:マニフェストファイル (appsscript.json) の設定
コーディングに入る前に、この Apps Script プロジェクトが「Workspace Studio のアクション」であることを宣言する必要があります。
スクリプトエディタで appsscript.json を開き、以下のような addOns 設定を追加します。これにより、Studio 側からこのスクリプトが見えるようになります。
// ... (前略) "addOns": { "common": { "name": "Chat Space Management", "logoUrl": "https://www.gstatic.com/images/icons/material/system_gm/1x/people_alt_black_24dp.png" }, "flows": { "workflowElements": [ { "id": "addMemberToSpaceElement", "name": "Add Member to Space", "description": "Adds a user with the specified email address to a Google Chat space.", "workflowAction": { // ... 入力パラメータや実行関数の定義 ... "onConfigFunction": "onConfigAddMember", "onExecuteFunction": "onExecuteAddMemberToSpace" } } ] } }, // ... (後略)
実装のポイント:変数の受け渡し
まずはシンプルに、「スペース ID」と「メールアドレス」を入力して実行するアクションを作ります。
ここでのポイントは、メールアドレスを手入力するのではなく、前のステップ(Google フォームの回答データ)から受け取れるようにすることです。
そのために setIncludeVariables(true) を設定し、変数の選択を許可します。
実装イメージ(Ver.1)
Workspace Studio の設定画面(UI)を作る onConfig 関数です。
// Ver.1: テキスト入力だが、変数は選べるようにした設定画面 function onConfigAddMember(event) { // 1. スペースIDを入力させるテキストボックス const spaceInput = CardService.newTextInput() .setFieldName("spaceId") .setTitle("追加先のスペースID (spaces/...)"); // 2. メールアドレスを入力させるテキストボックス // Googleフォームの回答(変数)を受け取れるように設定を追加 const emailInput = CardService.newTextInput() .setFieldName("email") .setTitle("追加するメンバーのメールアドレス") .setHostAppDataSource( CardService.newHostAppDataSource().setWorkflowDataSource( CardService.newWorkflowDataSource().setIncludeVariables(true) ) ); // ... (これらをCardに追加して返す) }
やってみた結果……「機能はするが、もっと便利にしたい」
公式ドキュメント「ステップをデプロイしてテストする」にある通り、スクリプトエディターの右上にある「デプロイ」から「デプロイをテスト」> 「インストール」を選択すると、Workspace Studioのアクションに自作アクションが表示されるようになりました!画面右側の一番下にある「Add member to Space」です。

これで、メールアドレスはフォームの回答者情報を自動でセットできるようになりました。基本機能としては十分要件を満たしています。

[NOTICE]
記事執筆時点(2025年11月26日)では、メールアドレスの項目をGoogleフォーム内に明示的に作らないと、StudioのVariableとして取得できませんでした。今後の改善を期待しています。
ただ、実際に運用してみると「スペース ID の入力」に少し手間がかかることに気づきました。
Step 1 の実験でも触れましたが、スペース ID を入力するためにはブラウザの URL バーを確認し、mail.google.com/chat/.../spaces/AAAAxxxx のような文字列から ID を特定してコピペする必要があります。
自分だけが使うなら問題ありませんが、他のメンバーにも気軽に使ってもらうには、もう少し直感的な操作にしたいところです。
Step 3. Google Workspace の力を解き放つ(オートコンプリート実装)
そこで、Google Workspace の強みを活かした「オートコンプリート(サジェスト)」機能を実装し、さらに使いやすく進化させることにしました。
実は、Workspace Studio のカスタムステップでは、少しコードを書き換えるだけで、Google Workspace 上のデータ(スペース一覧やユーザー一覧)を検索候補として表示することができます。
改善策:PlatformDataSource を使う
Apps Script のコードを修正します。TextInput(テキスト入力)の代わりに、SelectionInput(選択入力)を使用し、データソースに PlatformDataSource を指定します。
// Ver.2: オートコンプリート対応の設定画面 function onConfigAddMember(event) { // 1. スペース選択用ウィジェット (オートコンプリート) const spaceSelectionInput = CardService.newSelectionInput() .setFieldName("spaceId") .setTitle("追加先のスペース") .setType(CardService.SelectionInputType.MULTI_SELECT) .setMultiSelectMaxSelectedItems(1) .setPlatformDataSource( CardService.newPlatformDataSource() .setHostAppDataSource( CardService.newHostAppDataSource() .setWorkflowDataSource( CardService.newWorkflowDataSource() // trueにすると、前のステップからの変数 ($変数名) を選択肢に含めます。 .setIncludeVariables(true) // Google Chat の「スペース」をオートコンプリートで検索できるようにします。 .setType(CardService.WorkflowDataSourceType.SPACE) ) ) ); // 2. メールアドレス選択用ウィジェット (オートコンプリート) const emailInput = CardService.newSelectionInput() .setFieldName("email") .setTitle("追加するメンバーのメールアドレス") .setType(CardService.SelectionInputType.MULTI_SELECT) .setMultiSelectMaxSelectedItems(1) .setPlatformDataSource( CardService.newPlatformDataSource() .setHostAppDataSource( CardService.newHostAppDataSource() .setWorkflowDataSource( CardService.newWorkflowDataSource() .setIncludeVariables(true) // Google Workspace の「ユーザー」をオートコンプリートで検索できるようにします。 .setType(CardService.WorkflowDataSourceType.USER) ) ) ); // ... (Cardに追加して返す) }
コードを更新して、再度 Workspace Studio の画面を開いてみます。 「追加先のスペース」をクリックすると、最近使ったスペースが候補として表示されるようになりました。「LT」と入力すれば、「LT大会」などのスペース名で検索できます。

これなら、スペース ID を意識する必要はありません。「どのスペースに」「誰を」追加するか選ぶだけで、とても便利です。
まとめ
Workspace Studio は、標準のテンプレートだけでも十分に便利ですが、Apps Script と組み合わせることで真価を発揮します。
特に、今回ご紹介した PlatformDataSource を使ったオートコンプリート機能を使えば、ちょっとした手間で誰でも直感的に使えるツールになります。
皆さんも、「あと少し、ここさえ自動化できれば……」という業務があれば、ぜひカスタムステップの自作にチャレンジしてみてください。
付録 1:本記事の完成版コード
最後に、今回の記事で作成した Apps Script の全コードを掲載します。
appsscript.json(クリックで展開)
{ "timeZone": "Asia/Tokyo", "exceptionLogging": "STACKDRIVER", "runtimeVersion": "V8", "dependencies": { "enabledAdvancedServices": [ { "userSymbol": "Chat", "serviceId": "chat", "version": "v1" } ] }, "addOns": { "common": { "name": "Chat Space Management", "logoUrl": "https://www.gstatic.com/images/icons/material/system_gm/1x/people_alt_black_24dp.png" }, "flows": { "workflowElements": [ { "id": "addMemberToSpaceElement", "state": "ACTIVE", "name": "Add Member to Space", "description": "Adds a user with the specified email address to a Google Chat space.", "workflowAction": { "inputs": [ { "id": "spaceId", "cardinality": "SINGLE", "dataType": { "basicType": "STRING" }, "required": true }, { "id": "email", "cardinality": "SINGLE", "dataType": { "basicType": "STRING" }, "required": true } ], "outputs": [], "onConfigFunction": "onConfigAddMember", "onExecuteFunction": "onExecuteAddMemberToSpace" } } ] } }, "oauthScopes": [ "https://www.googleapis.com/auth/chat.memberships" ] }
コード.gs(クリックで展開)
/** * Google Chat スペースメンバー追加エージェントの実行関数。 * (appsscript.json の onExecuteFunction から呼び出されます) * * @param {object} event - Workspace Flow Agent からのイベントオブジェクト。 * @returns {object | void} - 成功時はStudioに完了を通知する renderAction オブジェクト。失敗時は何も返さない。 */ function onExecuteAddMemberToSpace(event) { // 1. Studioから渡された入力値を取得 // Studioの入力は常に配列 (stringValues) として渡されます。 const inputs = event.workflow?.actionInvocation?.inputs; const spaceId = inputs?.spaceId?.stringValues?.[0]; const email = inputs?.email?.stringValues?.[0]; // 2. 入力値のバリデーション if (!spaceId || !email) { console.error("必須パラメータ (spaceId または email) がありません。"); console.error("受信した入力:", JSON.stringify(inputs)); // エラーが発生した場合、renderAction を返さないことで // Studio にこのステップが失敗したことを伝えます。 return; } console.log(`メンバー追加処理を開始: Space=${spaceId}, Email=${email}`); // 3. Chat API 呼び出しのペイロードを作成 const membershipPayload = { "member": { "name": `users/${email}`, // Chat API は 'users/{email}' 形式を要求します "type": "HUMAN" } }; try { // 4. Chat API の呼び出し // Chat API Advanced Service (Chat) を使用します。 // spaceId は 'spaces/XXXX' という形式である必要があります。 // Studioから渡される値に 'spaces/' が含まれていない場合を考慮し、フォーマットします。 const formattedSpaceId = spaceId.startsWith('spaces/') ? spaceId : `spaces/${spaceId}`; console.log(`Chat API 呼び出し: Chat.Spaces.Members.create (Space=${formattedSpaceId})`); // メンバーシップを作成(メンバーを追加) const newMembership = Chat.Spaces.Members.create(membershipPayload, formattedSpaceId); console.log("メンバーの追加に成功しました。", newMembership); // 5. Studio への成功応答 // 処理が正常に完了したことをStudioに通知します。 const renderAction = { "hostAppAction": { "workflowAction": { "returnOutputVariablesAction": { // このエージェントは次のステップに渡す「出力変数」がないため、 // 空の配列を返します。 "variableValues": [] } } } }; console.log("Studioに成功のrenderActionを返します。"); return renderAction; } catch (e) { // 6. エラーハンドリング console.error(`メンバーの追加に失敗しました。 Space: ${spaceId}, User: ${email}, Error: ${e.message}`, e); // catchブロックでrenderActionを返さない(またはエラーをthrowする)と、 // Studioはこのステップが失敗したと認識します。 } } /** * 「メンバーをスペースに追加」エージェントの設定カードを生成します。 * (appsscript.json の onConfigFunction から呼び出されます) * * @param {object} event - Workspace Flow Agent からのイベントオブジェクト。 * @returns {Card} - CardService で構築された設定カードオブジェクト。 */ function onConfigAddMember(event) { // 1. スペース選択用ウィジェット (オートコンプリート) const spaceSelectionInput = CardService.newSelectionInput() // 実行関数(onExecute)に渡すためのID。appsscript.json の inputs.id と一致させる必要があります。 .setFieldName("spaceId") .setTitle("追加先のスペース") // Studioの変数ピッカー ($) と併用する場合、MULTI_SELECT のみサポートされます。 .setType(CardService.SelectionInputType.MULTI_SELECT) // 1つだけ選択させたい場合は、最大選択数を1に設定します。 .setMultiSelectMaxSelectedItems(1) .setPlatformDataSource( CardService.newPlatformDataSource() .setHostAppDataSource( CardService.newHostAppDataSource() .setWorkflowDataSource( CardService.newWorkflowDataSource() // trueにすると、前のステップからの変数 ($変数名) を選択肢に含めます。 .setIncludeVariables(true) // Google Chat の「スペース」をオートコンプリートで検索できるようにします。 .setType(CardService.WorkflowDataSourceType.SPACE) ) ) ); // 2. メールアドレス選択用ウィジェット (オートコンプリート) const emailInput = CardService.newSelectionInput() .setFieldName("email") // appsscript.json の inputs.id と一致させる .setTitle("追加するメンバーのメールアドレス") .setType(CardService.SelectionInputType.MULTI_SELECT) .setMultiSelectMaxSelectedItems(1) .setPlatformDataSource( CardService.newPlatformDataSource() .setHostAppDataSource( CardService.newHostAppDataSource() .setWorkflowDataSource( CardService.newWorkflowDataSource() // 前のステップからの変数 ($変数名) を選択肢に含めます。 .setIncludeVariables(true) // Google Workspace の「ユーザー」をオートコンプリートで検索できるようにします。 .setType(CardService.WorkflowDataSourceType.USER) ) ) ); // 3. セクションの作成 // 各ウィジェットをセクションに追加します。 const section = CardService.newCardSection() .setHeader("スペースと追加するメンバーを選択") .addWidget(spaceSelectionInput) .addWidget(emailInput); // 4. カードの構築 // セクションをカードに追加してビルドします。 const card = CardService.newCardBuilder() .addSection(section) .build(); // 5. カードオブジェクトを返す // この戻り値が Studio の設定UIとして表示されます。 return card; }
付録 2:JSONでUIを定義する
Apps Script の CardService ビルダーメソッドを使用せず、JSONを直接記述することでUIを定義することもできます。詳しくは google.apps.card.v1 をご覧ください。
例えば、付録 1の onConfigAddMember は次のように書き換えることができます。
function onConfigAddMember(event) { return { // 4. カードの構築 (CardService.newCardBuilder().addSection(section).build()) "sections": [ // 3. セクションの作成 (CardService.newCardSection().setHeader(...).addWidget(...)) { "header": "スペースと追加するメンバーを選択", "widgets": [ // 1. スペース選択用ウィジェット { "selectionInput": { "name": "spaceId", // setFieldName("spaceId") "label": "追加先のスペース", // setTitle("追加先のスペース") "type": "MULTI_SELECT", // setType(CardService.SelectionInputType.MULTI_SELECT) "platformDataSource": { "hostAppDataSource": { "workflowDataSource": { "includeVariables": true, // setIncludeVariables(true) — 前のステップからの変数を含める "type": "SPACE" // setType(CardService.WorkflowDataSourceType.SPACE) — Chat スペースのオートコンプリート } } } } }, // 2. メールアドレス選択用ウィジェット { "selectionInput": { "name": "email", // setFieldName("email") [3] "label": "追加するメンバーのメールアドレス", // setTitle("追加するメンバーのメールアドレス") "type": "MULTI_SELECT", // setType(CardService.SelectionInputType.MULTI_SELECT) "platformDataSource": { "hostAppDataSource": { "workflowDataSource": { "includeVariables": true, // setIncludeVariables(true) — 変数を含める "type": "USER" // setType(CardService.WorkflowDataSourceType.USER) — Google Workspace ユーザーのオートコンプリート } } } } } ] } ] } }
付録 3:トラブルシューティング・ガイド
Step 1 の Chat API テストでつまずきやすいポイントをまとめました。
Q1. 実行するとエラーログに ReferenceError: Chat is not defined と表示される
A1. スクリプトエディターの「サービス」で、Google Chat API を追加してください。その際、ID(識別子)は Chat に設定してください。
Q2. 承認画面で「権限を確認」へ進んだ後、「アクセスをブロック: 認証エラーです Some requested scopes cannot be shown: [https://www.googleapis.com/auth/chat.app.spaces]」と表示される
A2. 設定が不足しています。特に、スクリプトエディターで appsscript.json を変更していない可能性が高いです(appsscript.json を設定しない場合、oauthScopes に https://www.googleapis.com/auth/chat.admin.memberships が自動的に設定されてしまい、Google Workspaceの管理者以外が利用できないエラーになります)。「Apps Script ではじめる🤖Google Chat アプリ開発ガイド(ユーザー認証編)」を参考にして、設定が不足していないか確認してください。
Q3. 実行すると GoogleJsonResponseException: API call to chat.spaces.members.create failed with error: Google Chat API has not been used in project ... というエラーが表示される
A3. Apps Script に紐付けた Google Cloud プロジェクト側で、Google Chat API が有効化されていません。Google Cloud コンソールで API を有効にしてください。
Q4. 実行すると GoogleJsonResponseException: API call to chat.spaces.members.create failed with error: Google Chat app not found. というエラーが表示される
A4. Apps Script に紐付けた Google Cloud プロジェクトで、Google Chat API の「構成」設定(Chat アプリの設定)が完了していません。設定してください。