context.messaging.sendメソッド

context.messaging.request で連携したメッセージサービスに対してメッセージを送信します。送信が完了すると callback が呼び出され、第1引数にエラー情報(成功時は null)が渡されます。

引数

  • message: 送信内容を表すオブジェクト。サービスによって構造が異なります。
  • callback: 送信完了時に呼び出される関数。省略可能です。

LINE / LINEグループ

type: 'line' または type: 'linegroup' で連携した場合は、LINE Messaging API のメッセージ仕様に従います。

context.messaging.send({
  type: 'text',
  text: 'Hello, world'
}, (error) => {
  if (error) {
    context.log('送信に失敗しました', { error });
  }
});

利用可能なメッセージ形式の詳細は LINE 公式ドキュメントを参照してください。

メール

type: 'mail' で連携すると、許可ダイアログなしでメール送信用トークユーザーが自動作成されます。message には以下のプロパティを指定します。

フィールド 必須 説明
subject メール件名
body プレーンテキスト本文
htmlBody   HTML本文。省略時はプレーンテキストのみ送信
to 宛先メールアドレス(文字列または文字列配列)

送信元(From)は環境側で決められたシステムアドレスが利用されます。1時間あたり10通までのレート制限があり、超過すると callback の第1引数にエラーが渡されます。

context.messaging.send({
  subject: '実験参加の御礼',
  body: 'ご協力ありがとうございました。',
  to: 'participant@example.com'
});

Webhook

type: 'webhook' で連携すると、許可ダイアログなしでWebhook送信用トークユーザーが自動作成されます。任意のURLにHTTP POSTリクエストを送信できるため、外部サービスとの連携に利用できます。

message には以下のプロパティを指定します。

フィールド 必須 説明
url 送信先URL(http:// または https:// のみ)
payload   送信するJSONペイロード。省略時は空オブジェクト
headers   追加のHTTPヘッダー

1時間あたり60回までのレート制限があります。リクエストのタイムアウトは10秒です。HTTPステータス400以上またはネットワークエラー時は callback の第1引数にエラーが渡されます。エラー時はレート制限カウントを消費しません。

context.messaging.request({ type: 'webhook' }, (result, err) => {
  if (err) return console.error('Setup error:', err);

  context.messaging.send({
    url: 'https://example.com/webhook',
    payload: {
      event: 'task_completed',
      taskId: context.taskId,
      userId: context.userId,
      timestamp: Date.now()
    }
  }, (error) => {
    if (error) console.error('Send failed:', error);
  });
});

署名検証

Webhookリクエストには、リクエストの正当性を検証するための署名ヘッダーが自動的に付与されます。

ヘッダー 説明
x-goemon-signature HMAC-SHA256署名(Base64エンコード)
x-goemon-timestamp リクエスト送信時のUnixタイムスタンプ(ミリ秒)

署名は taskId を秘密鍵として、timestamp + '.' + body を HMAC-SHA256 で署名し、Base64エンコードしたものです。受信側で以下のように検証できます。

const crypto = require('crypto');

function verifySignature(taskId, timestamp, body, signature) {
  const expected = crypto
    .createHmac('sha256', taskId)
    .update(timestamp + '.' + body)
    .digest('base64');
  return signature === expected;
}

サンプル: Google Apps Script連携

Google Apps Script (GAS) でWebhookを受信し、スプレッドシートへの記録やメール送信を行う例です。

タスク側スクリプト

const notifyEmail = context.param.notifyEmail || '';

context.messaging.request({ type: 'webhook' }, (result, err) => {
  if (err) return alert('Setup error: ' + err);

  context.messaging.send({
    url: 'https://script.google.com/macros/s/YOUR_DEPLOY_ID/exec',
    payload: {
      event: 'task_completed',
      taskId: context.taskId,
      userId: context.userId,
      notifyEmail: notifyEmail,
      data: { score: 100, duration: 3000 },
      timestamp: Date.now()
    }
  }, (error) => {
    if (error) console.error('Send failed:', error);
  });
});

タスクパラメータ設定:

パラメータ名
notifyEmail researcher@example.com

GAS受信側スクリプト

function doPost(e) {
  try {
    const payload = JSON.parse(e.postData.contents);

    // スプレッドシートに記録
    const sheet = SpreadsheetApp.openById('YOUR_SPREADSHEET_ID').getActiveSheet();
    sheet.appendRow([
      new Date(),
      payload.taskId || '',
      payload.event || '',
      payload.notifyEmail || '',
      JSON.stringify(payload.data || {})
    ]);

    // payloadからメールアドレスを取得して送信
    if (payload.notifyEmail) {
      MailApp.sendEmail({
        to: payload.notifyEmail,
        subject: 'タスク完了通知: ' + payload.taskId,
        body: 'タスクが完了しました。\n\n' +
              'Task ID: ' + payload.taskId + '\n' +
              'User ID: ' + payload.userId + '\n' +
              'Data: ' + JSON.stringify(payload.data, null, 2)
      });
    }

    return ContentService
      .createTextOutput(JSON.stringify({ status: 'ok' }))
      .setMimeType(ContentService.MimeType.JSON);
  } catch (error) {
    console.error(error);
    return ContentService
      .createTextOutput(JSON.stringify({ status: 'error', message: error.message }))
      .setMimeType(ContentService.MimeType.JSON);
  }
}

// 署名検証(任意だが推奨)
function verifySignature(taskId, timestamp, body, signature) {
  const data = timestamp + '.' + body;
  const expectedSignature = Utilities.base64Encode(
    Utilities.computeHmacSha256Signature(data, taskId)
  );
  return signature === expectedSignature;
}

GASデプロイ手順

  1. Google Apps Scriptで新規プロジェクトを作成
  2. 上記コードを貼り付け
  3. デプロイ新しいデプロイ
  4. 種類: ウェブアプリ
  5. アクセス: 全員(匿名含む)
  6. デプロイしてURLをコピーし、タスクスクリプトの url に設定

エラーハンドリング

  • LINE/メール/Webhook共通で、送信に失敗した場合は callback の第1引数にエラーオブジェクトが設定されます。
  • callback を省略した場合はエラーがタスクスクリプトに伝播しないため、重要な連絡を送るワークフローではハンドリングを実装してください。

Copyright © 2021-2025 GO-E-MON Project.