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デプロイ手順
- Google Apps Scriptで新規プロジェクトを作成
- 上記コードを貼り付け
- デプロイ → 新しいデプロイ
- 種類: ウェブアプリ
- アクセス: 全員(匿名含む)
- デプロイしてURLをコピーし、タスクスクリプトの
urlに設定
エラーハンドリング
- LINE/メール/Webhook共通で、送信に失敗した場合は
callbackの第1引数にエラーオブジェクトが設定されます。 callbackを省略した場合はエラーがタスクスクリプトに伝播しないため、重要な連絡を送るワークフローではハンドリングを実装してください。