コンテンツにスキップ

Googleフォームと連携する

Googleフォームの回答を Google Apps Script(GAS)から nocall の公開 API へ送り、フォーム送信後に即時架電します。

  • Google アカウントと nocall アカウントがある
  • 架電に使うエージェントと登録先のコンタクトグループを作成済み
  • Googleフォームの回答先を Googleスプレッドシートに設定済み
  • nocall の API キーを発行済み

フォームには少なくとも電話番号の質問が必要です。氏名や会社名などは任意で、エージェントが必要とするカスタム変数に合わせて用意します。

Googleフォームの回答先スプレッドシートを開き、メニューの「拡張機能」→「Apps Script」を選択します。

Apps Script の「プロジェクトの設定」→「スクリプト プロパティ」に次の値を追加します。

プロパティ
NOCALL_API_KEY nocall で発行した API キー
NOCALL_AGENT_ID 架電に使うエージェント ID
NOCALL_USER_GROUP_ID 登録先のコンタクトグループ ID

フォームの質問名に合わせて namedValues のキーと attributions を変更してください。

function onFormSubmit(event) {
const values = event.namedValues;
const phoneNumber = firstValue(values, "電話番号");
const payload = {
phoneNumber: toE164Japan(phoneNumber),
agentId: getRequiredProperty("NOCALL_AGENT_ID"),
userGroupId: getRequiredProperty("NOCALL_USER_GROUP_ID"),
attributions: [
{ label: "氏名", value: optionalValue(values, "氏名") },
{ label: "会社名", value: optionalValue(values, "会社名") },
{ label: "メールアドレス", value: optionalValue(values, "メールアドレス") },
].filter((attribute) => attribute.value),
};
const response = UrlFetchApp.fetch(
"https://api.nocall.ai/api/v1/end-users/add-and-call",
{
method: "post",
contentType: "application/json",
headers: { "x-api-key": getRequiredProperty("NOCALL_API_KEY") },
payload: JSON.stringify(payload),
muteHttpExceptions: true,
},
);
if (response.getResponseCode() >= 300) {
throw new Error(`nocall API error: ${response.getContentText()}`);
}
}
function firstValue(namedValues, questionName) {
const value = namedValues[questionName]?.[0];
if (!value) throw new Error(`${questionName}が空です`);
return String(value).trim();
}
function optionalValue(namedValues, questionName) {
return String(namedValues[questionName]?.[0] ?? "").trim();
}
function toE164Japan(value) {
const normalized = String(value).replace(/[\s()-]/g, "");
if (normalized.startsWith("+")) return normalized;
if (normalized.startsWith("0")) return `+81${normalized.slice(1)}`;
throw new Error("電話番号は0または+から始めてください");
}
function getRequiredProperty(name) {
const value = PropertiesService.getScriptProperties().getProperty(name);
if (!value) throw new Error(`${name}が設定されていません`);
return value;
}
  1. Apps Script 左メニューの「トリガー」を開きます。
  2. 「トリガーを追加」を選択します。
  3. 実行する関数に onFormSubmit を指定します。
  4. イベントのソースに「スプレッドシートから」を指定します。
  5. イベントの種類に「フォーム送信時」を指定して保存します。
  6. 初回の権限確認を完了します。

スクリプトをウェブアプリとしてデプロイする必要はありません。

サンプルと異なる質問を使う場合は、namedValues のキーを Googleフォームの質問名と完全に一致させ、取得した値を attributions に追加します。

たとえば「部署」という記述式の質問を追加する場合は、次のように変更します。

const department = values["部署"]?.[0] ?? "";
const payload = {
// phoneNumber、agentId、userGroupIdは省略
attributions: [
{ label: "部署", value: department },
],
};

空欄を許可しない質問では firstValue(values, "部署") を使用できます。エージェントのプロンプトで {部署} のようなカスタム変数を使う場合、同じ名前の labelattributions に含めてください。

Googleフォームからテスト回答を 1 件送信します。Apps Script の「実行数」で成功を確認し、nocall のコンタクトと通話履歴に結果が作成されることを確認します。

  • 質問名と namedValues のキーが完全に一致しているか確認する
  • Apps Script の「実行数」からエラーメッセージを確認する
  • エージェントが必要とする属性を attributions に含める
  • 電話番号を +81 から始まる形式へ変換できているか確認する
  • API キー、エージェント ID、コンタクトグループ IDを確認する

詳細は Google Apps Script のインストール型トリガーイベントオブジェクト を参照してください。