---
title: "Gmail の内容を要約して Slack へ通知する | grasys blog"
url: "https://blog.grasys.io/post/mhosoya/notification-gmail2slack/"
description: "こんにちは、mhosoya です。 弊社では、日々のコミュニケーションの基盤として Slack を活用しています。 業務連絡から雑談まで、Slack を利用しています。 そのため、 情報はできるだけ Slack に集約させたい！！！ と思っています。 Slack から離れることなく、他での状況を把握できるように目指し…"
---

# Gmail の内容を要約して Slack へ通知する

-   ![](/_astro/noicon.CTHOhNiB_1HMs6A.webp)[mhosoya](/authors/mhosoya/)
-   公開日：2026年3月18日
-   カテゴリー：[Tech](/categories/tech/)
-   タグ：[#Gemini](/tags/gemini/)[#Google Workspace Studio](/tags/google-workspace-studio/)[#生成AI](/tags/生成ai/)

![Gmail の内容を要約して Slack へ通知する](/_astro/hero.CiljPZmW_1c0yYH.webp)

こんにちは、mhosoya です。

弊社では、日々のコミュニケーションの基盤として **Slack** を活用しています。  
業務連絡から雑談まで、Slack を利用しています。

そのため、**情報はできるだけ Slack に集約させたい！！！** と思っています。

Slack から離れることなく、他での状況を把握できるように目指していきたいと思います。

そのため、今回は指定の **Gmail** の内容を**要約**させて **Slack** に通知させようかと思います。

今回、 **Google Workspace Studio**（旧Workspace Flows）を使用して実現していきます。

## Google Workspace Studio （旧 Workspace Flows ）とは

**Google Workspace Studio** は、**Gemini** を使用して Google Workspace サービス全体で日常の定型的なタスクをノーコードで自動化できるオンライン アプリです。

[Google Workspace](https://workspace.google.com/) の有料プランを契約していれば、基本機能として **Google Workspace Studio** が含まれています。

## 全体の流れ

### Slack

1.  Slack アプリの作成・設定
    
2.  Slack アプリの権限を設定する
    
3.  (省略可) Slack アプリのアイコン画像を設定する
    
4.  Slack ワークスペース にインストール
    
5.  Slack アプリを追加する
    

### Google Workspace Studio

1.  GAS(Google Apps Script) で Slack に送信する処理を用意する
    
2.  Google Workspace Studio で flow を作成する
    

## Slack API でアプリを作成する

### Slack アプリの作り方を選択する

1.  **[Slack API: Applications](https://api.slack.com/apps/)** の画面を開く
    
2.  **Create New App** を押下する
    
3.  **From scratch** を選択する
    

![Create Slack New App](/_astro/01-create_slack_app_1-2-1024x714-956ad891.DrPMIPOg_Z1LCh8s.webp)

### Slack アプリの基本設定

1.  **App Name** に 任意の名前 を設定する
    
    -   今回は **Gmail Summarizer** を設定します
2.  **Pick a workspace to develop your app in** に 通知 を送りたい ワークスペース を選択する
    

![New Slack App Settings](/_astro/02-create_slack_app_2-1-1024x705-d7802ac7.BCDBbmg-_Z1LaLdr.webp)

## Slack アプリの権限を設定する

1.  Features > **OAuth & Permissions** を選択する
    
2.  スコープ > ボット トークンのスコープ で下記の **OAuth スコープ** を追加する
    
    -   **chat:write**
        -   メッセージを送信する権限

![Slack App OAuth &amp; Permissions](/_astro/03-slack_oauth_permissions-1-1024x808-5b1a9e6d.CIFNOAot_Z1sduAn.webp)

![slack app oauth &amp; permissions](/_astro/04-slack_app_permissions-1-1024x505-af7a2af7.CR0wC8LR_Z13v3p7.webp)

## (省略可) Slack アプリのアイコン画像を設定する

今回は、 **Nano Banana 2** で生成したアイコン画像を使っていきたいと思います

![gmail summarizer icon](/_astro/05-gemini_summarizer_app_icon-d1ff4032.D1SXCI_w_1C0ruh.webp)

-   Settings > Basic Information を選択する
    -   App icon & Preview に任意のアイコン画像を設定する

![slack app display information](/_astro/06-slack_app_icon_settings-1-1024x1012-632be4a2.DMf0wM3z_Z1Civjz.webp)

## Slack ワークスペース にインストール

1.  Install App > **Install to ワークスペース名** を押下する
    
2.  作成した アプリ に Slack へのアクセスを許可する
    

![slack api install app](/_astro/07-slack_api_install_app-1-1024x349-b21f1cb8.BbwaX_60_Z1P2yAr.webp)

![Slack Api Apply Install App](/_astro/08-slack_api_apply_install_app-1024x566-1b37c21e.Cia-iMRr_fm2Wt.webp)

## Slack BOT トークン

-   Install App > Installed App Settings の**Bot User OAuth Token** をコピーして控えておく

![Copy Slack Bot User OAuth Token](/_astro/09-copy_slack_bot_token-1024x432-c3b87ef1.Cubs44Of_wVWz6.webp)

ここまでで Slack Api でのアプリ作成・設定の作業は完了です

## Slack アプリを追加する

今回、作成した Slack アプリを追加していきます

App の 三点リーダーメニュー > 管理する > アプリをブラウズする を選択する

![add slack app 01](/_astro/10-add_slack_app-1024x266-8686261a.Bx5FmYSc_ruFAz.webp)

作成した Slack アプリを選択する

![add slack app 02](/_astro/11-add_slack_app2-1-1024x413-63911976.D_GdWPxu_Z6blLc.webp)

作成した Slack アプリの詳細から「アプリを開く」を押下する

![add slack app 03](/_astro/12-add_slack_app3-1024x566-50cde508.Ci5irE9j_29znbu.webp)

Slack アプリが追加されたことを確認する

![add slack app 04](/_astro/13-add_slack_app4-1024x343-1f55a0cd.Cd26UHNT_Z15Ls7A.webp)

## 作成した Slack アプリから DM を送ってみる

### Slack メンバー ID をコピーする

プロフィール画面の右下にある三点リーダー から **メンバー ID を コピー** を選択する  
※ここでコピーした Slack のメンバー ID は後ほど使用するため、控えておいてください

![copy slack member id 01](/_astro/14-three_points_menu-1024x869-50964275.Dd_xQA3u_Z1kLLqz.webp)

![copy slack member id 02](/_astro/15-copy_slack_member_id-1024x882-b3109153.CicWRtrN_m9QMJ.webp)

DM チャネルをオープンする

Plain textcontent\_copy

```
USER_ID="U**********"
BOT_TOKEN="xoxb-**********-**************-************************"

curl -X POST \
  -H "Authorization: Bearer $BOT_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"users\": \"$USER_ID\"}" \
  https://slack.com/api/conversations.open
```

レスポンスから `**channel.id**` を控えておく

Plain textcontent\_copy

```
{
  "ok": true,
  "no_op": false,
  "already_open": false,
  "channel": {
    "id": "**ここの値をコピー**"
  },
  "warning": "missing_charset",
  "response_metadata": {
    "warnings": [
      "missing_charset"
    ]
  }
}
```

上記で取得した `**channel.id**` を指定して、DM でメッセージを送信する

Plain textcontent\_copy

```
BOT_TOKEN="xoxb-**********-**************-************************"
CHANNEL_ID="D**********"

curl -X POST \
  -H "Authorization: Bearer ${BOT_TOKEN}" \
  -H "Content-Type: application/json" \
  --data '{"channel":"'"${CHANNEL_ID}"'", "text":"Hello from bot!"}' \
  https://slack.com/api/chat.postMessage
```

成功！

Plain textcontent\_copy

```
{
  "ok": true,
  "channel": "D**********",
  "ts": "1772383582.206849",
  "message": {
    "user": "U**********",
    "type": "message",
    "ts": "1772383582.206849",
    "bot_id": "B**********",
    "app_id": "A**********",
    "text": "Hello from bot!",
    "team": "T********",
    "bot_profile": {
      "id": "B**********",
      "app_id": "A**********",
      "user_id": "U**********",
      "name": "Gmail Summarizer",
      "icons": {
        "image_36": "https://avatars.slack-edge.com/2026-03-01/10619740460705_a5781b3e6a56152a37b2_36.png",
        "image_48": "https://avatars.slack-edge.com/2026-03-01/10619740460705_a5781b3e6a56152a37b2_48.png",
        "image_72": "https://avatars.slack-edge.com/2026-03-01/10619740460705_a5781b3e6a56152a37b2_72.png"
      },
      "deleted": false,
      "updated": 1772381995,
      "team_id": "T********"
    },
    "blocks": [
      {
        "type": "rich_text",
        "block_id": "*****",
        "elements": [
          {
            "type": "rich_text_section",
            "elements": [
              {
                "type": "text",
                "text": "Hello from bot!"
              }
            ]
          }
        ]
      }
    ]
  },
  "warning": "missing_charset",
  "response_metadata": {
    "warnings": [
      "missing_charset"
    ]
  }
}
```

![received direct message.](/_astro/16-received_dm-1024x980-7674aa63.XBNEHnLU_1aR96u.webp)

## GAS(Google Apps Script) で Slack に送信する処理を用意する

Slack への送信は、 **GAS** で実装していきます

Google Workspace Studio の Step でメール受信 -> 要約 -> スプレッドシート に書き込むまでを行います

GAS では要約を書き込まれたのをトリガーとして発火して、 Slack へメッセージを送信します

まずは、 **Apps Script** を作成します

![create gas](/_astro/17-init_gas-1024x352-153ad1e0.CPmRTlsr_2bG1ES.webp)

続いて、スクリプトを作成します

![create gas script](/_astro/18-create_gas_script-2-1024x417-977cee1f.p8YCH2BO_Z1iwbvk.webp)

作成したら、 **SlackApiClient.gs** に下記のコードを貼り付けます

SlackApiClient.gs

Plain textcontent\_copy

```
class SlackApiClient {
  constructor() {
    const scriptProperties = PropertiesService.getScriptProperties();
    this.SLACK_BOT_TOKEN = scriptProperties.getProperty("SLACK_BOT_TOKEN");
    this.SLACK_USER_ID = scriptProperties.getProperty("SLACK_USER_ID");
    this.SLACK_API_ENDPOINT_CONVERSATIONS_OPEN = "https://slack.com/api/conversations.open";
    this.SLACK_API_ENDPOINT_POST_MESSAGE = "https://slack.com/api/chat.postMessage";

    this.OPTIONS = {
      "method": "post",
      "contentType": "application/json",
      "headers": {
        "Authorization": Utilities.formatString("Bearer %s", this.SLACK_BOT_TOKEN)
      },
    };
  }

  /// DM を開く
  openConversations() {
    const options = this.OPTIONS;
    const payload = {
      "users": this.SLACK_USER_ID
    };
    options["payload"] = JSON.stringify(payload);

    const response = UrlFetchApp.fetch(this.SLACK_API_ENDPOINT_CONVERSATIONS_OPEN, options).getContentText();
    const json = JSON.parse(response);
    return json.channel.id;
  }

  /// メッセージを送信
  postMessage(message, channelId) {
    const options = this.OPTIONS;
    const payload = {
      "channel": channelId,
      "text": message,
    };
    options["payload"] = JSON.stringify(payload);

    const response = UrlFetchApp.fetch(this.SLACK_API_ENDPOINT_POST_MESSAGE, options).getContentText();
  }
}
```

続いて、 デフォルトで作成されていた **コード.gs** に下記を貼り付けます

コード.gs

Plain textcontent\_copy

```
const SHEET_NAME = "queue";
const START_ROW = 2;
const START_COLUMN = 1;
const MESSAGE_COLUMN_INDEX = 1;
const IS_NOTIFIED_COLUMN_INDEX = 2;
const SLACK_API_ENDPOINT_CONVERSATIONS_OPEN = "https://slack.com/api/conversations.open"

function onChanged(e) {
  if (e.changeType == 'EDIT') {
    const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
    const cellRange = sheet.getRange(START_ROW, START_COLUMN, sheet.getLastRow(), sheet.getLastColumn())
    const values = cellRange.getValues();
    if (values.length === 0) return;

    for (const rowIndex in values) {
      const row = values[rowIndex];
      const is_notified = row[IS_NOTIFIED_COLUMN_INDEX];
      if (is_notified !== false) continue;

      const startRowIndex = Number(START_ROW) + Number(rowIndex);
      const notifiedCell = sheet.getRange(startRowIndex, IS_NOTIFIED_COLUMN_INDEX + 1, 1, 1);
      notifiedCell.setValue("TRUE");

      const message = row[MESSAGE_COLUMN_INDEX];
      sendSlackMessage(message);
    }
  }
}

function sendSlackMessage(message) {
  const slackApiClient = new SlackApiClient();
  const channelId = slackApiClient.openConversations();
  slackApiClient.postMessage(message, channelId);
}
```

GAS の実装はこれで完了です

続いて、**スクリプト プロパティ** に下記を設定します

-   SLACK\_BOT\_TOKEN
    
-   [ここで取得した Slack BOT Token を貼り付けます](#slack-bot-%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3)
    
-   SLACK\_USER\_ID
    
-   [ここで取得した Slack メンバー ID を貼り付けます](#slack-%E3%83%A1%E3%83%B3%E3%83%90%E3%83%BC-id-%E3%82%92%E3%82%B3%E3%83%94%E3%83%BC%E3%81%99%E3%82%8B)
    

最後に、 **スクリプト プロパティ を保存** を押下する

![GAS(Google Apps Script) で Slack に送信する処理を用意する画面](/_astro/19-settings_gas_property-1-1024x465-cec52afb.dFW5lEmg_D0jSV.webp)

**Google Workspace Studio** からメールの要約を書き込むスプレッドシートを用意します

-   シート名
    
    -   queue  
        ※GAS にシート名を指定している
-   セル
    
    -   列 A , B , C に id , message , is\_notified のヘッダーを指定する

![prepare spread sheet](/_astro/20-init_spread_sheet-1-e3fea4cd.CWT2c8gL_ClaD4.webp)

最後に、 **GAS** の **Trigger** を設定します

-   実行する関数を選択
    
    -   onChanged
-   イベントのソースを選択
    
    -   スプレッドシートから
-   イベントの種類を選択
    
    -   変更時

![settings gas trigger](/_astro/21-settings_gas_trigger-1024x945-9ba30bd0.CD07W6xR_lT2xP.webp)

これで一通り完了です

ここでテストをしてみます

先ほど、用意した **queue** シートのセルに適当な文字を入れます

最後に、 `**is_notified**` の列に `**FALSE**` を入力してください

![gas trigger test](/_astro/22-test_from_sp-ed01e857.0c3SI0Bb_Z1hAFiC.webp)

メッセージがきました

これでスプレッドシートに書き込めれば、 Slack にメッセージが送信できるのが確認できました

![gas trigger test result](/_astro/23-test_succeeded_from_sp-57bbe9fa.WHn5X0RU_ZkLJgT.webp)

## Google Workspace Studio で flow を作成する

Google Workspace Studio で指定したメールを受信したら、要約をしてスプレッドシートに書き込むまでをやっていきます

また、汎用的にやるなら flow は同じで良いかと思いますが、今回はメールの種類毎にどのように要約するか指示を変えたいと思っているので、メールの種類ごとで flow は分けます

まずは、 [Google Workspace Studio](https://studio.workspace.google.com/u/0) を開きます  
※Gmail の下記から Do more in Studio でも開けます

![workspace studio icon on gmail](/_astro/24-google_workspace_studio_icon-1024x270-dbd9e8f4.fizrcFzp_IIsFv.webp)

左のメニューの「＋」を押下する

![workspace studio top](/_astro/25-workspace_studio_top-1-1024x657-665a5e9c.HpHcyMmV_Z2qD3m2.webp)

-   **flow** の名前は **Gmail Summarizer** で設定します
    
-   **Starter** の **event** には **When I get an email** を選択します
    
    -   (指定のメールを受信したことをトリガーとするので）

![settings flow starter step](/_astro/26-f5fd141276ce12a574cd9acc1706d05a-c456df58.DkyLOBS7_ZiIp2t.webp)

今回は、Google Cloud からメールを受信したら、発火するようにしていきたいと思います

![settings flow starter step from email](/_astro/27-597ae554347016f2cc39dab17f033875-1-ecfd57de.CDwUkJvS_1wCRX0.webp)

**注意**

Gmail 側のフィルター設定で、 **受信トレイをスキップ (アーカイブする)** が有効になっていると発火しません

その場合は、 Gmail 側のアーカイブ設定は無効にして、 Workspace Studio 側でラベル付与とアーカイブをするようにすると発火しつつ、アーカイブまでしてくれます

![workspace studio add label and archive](/_astro/28-c3999bfa8c23016c4d8e482a0644a1b8-1024x633-e255e9a4.Dh75lyNI_1ENmxe.webp)

step には Gemini で要約をする **Summarize** を指定して、下記を設定する

-   What to summarize
    
    -   Email
-   Select email thread
    
    -   Step 1: Email thread ID
-   Additional instructions for Gemini
    
    -   任意の指示

![workspace studio summarize step](/_astro/29-workspace_studio_step_summarize-1-1024x777-f665453f.DfjAl_zt_Z1aCVzg.webp)

step には Add a row を指定して、各項目を指定する  
※Add data by column には指定したスプレッドシートの構造が反映されます

![workspace studio add a row step](/_astro/30-workspace_studio_step_addrow-1024x834-3f5cb5cd.Cj4cwAXd_Zra0QU.webp)

最後に下にある **Save changes** を押下する

**Test run** から過去のメールからテストで使用したいメールを選択して実行する

これで Slack に通知が届けば成功です

![summarized google cloud message](/_astro/31-succeeded-1-1024x145-f890a917.DxgRVE0k_Z2aEEFt.webp)

Slack への送信する部分は GAS を使用しないといけなかったですが、それ以外はノーコードで簡単に設定ができました

また、2025年12月3日 に **Custom Step** が GA されたのですが、すぐにプレビューに下がってしまいました

残念。。。

この Custom Step を使用すると社内で共有することができます

なので、今回のような GAS で実装した Slack 送信する Step を共有できるので、誰かが汎用的なものを作ってしまえばノーコードで色々とできるようになるかと思います

再度、 **Custom Step** が GA されるのを期待して待ちたいと思います！

※当社では情報セキュリティの観点から、入力データがGeminiの学習に利用されないよう設定を施し、社内ポリシーに則ってGmailとの連携を行っております。企業様によって生成AIや外部連携に関する運用ルールは異なりますので、本記事の仕組みをお試しになる際は、事前に社内の方針をご確認ください。

## この記事を書いた人

[![](/_astro/noicon.CTHOhNiB_Z24aAgM.webp)](/authors/mhosoya/)

### [mhosoya](/authors/mhosoya/)

mhosoyaのプロフィールと執筆記事をご覧いただけます。

[プロフィールと記事一覧](/authors/mhosoya/)