Google App Scriptを使ってGoogleフォームへの回答をSalesforceにリード登録する

Googleフォームへ送信された回答をSalesforceにリードとして登録する方法について解説します。

# 概要

Salesforceには「Web-to-リード」というWebフォームにサブミットされた内容をリードとして登録する機能があります。ですが、Googleフォームだと送信先等のカスタマイズができないため、この機能はそのままでは使用できません。しかし、Webフォームへのサブミット、要するにSalesforceの所定のURLに対してPOSTメソッドでリクエストボディを `application/x-www-form-urlencoded` でHTTP通信ができればよいので、Google App Script (GAS)を「フォーム送信時」をトリガーにして動かし、フォームの内容を送信しようというのが本記事の趣旨です。

# 1. Web-to-リードフォームの作成

Salesforceの設定からWeb-to-リードフォームを作成します。このフォームはGoogleフォームには直接組み込みませんが、 `oid` や項目名などを調べるのに使用します。

1. Salesforceの `設定` - `Web-to-リード` に移動します
2. `編集` で `Web-to-リードの有効化` にチェックを入れ、 `reCAPTCHA 確認が必要` のチェックを外して `保存` をクリックします
3.  `Web-to-リードフォームの作成` ボタンをクリックして、Web-to-リード設定ページを開きます
4. `選択済みの項目` にGoogleフォームで使用する項目を入れ、 `HTML に reCAPTCHA を含める` のチェックを外して `作成` をクリックします。 `戻り URL` は使用しないのでデフォルトのままで構いません
5. サンプルHTMLが表示されるので、メモ帳等で保存しておきます

![_2020-10-12_11.27.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99585/b6e0364f-2cd8-21c1-984a-87445e5ab7dd.png)

# 2. Googleフォームの作成

実際にお客様から情報を入力してもらうためのGoogleフォームを作成します。Googleフォームの作成方法については、一般的な手順と変わらないので割愛します。

一つアドバイスとしては、例えば氏名の入力欄を「姓」と「名」で分けるなど、Salesforceのリード項目と一対一対応するようにしておくと、後の作業がスムーズに進みます。

# 3. GoogleフォームとGoogleスプレッドシートの連携

1. 作成したGoogleフォームの回答タブにある `スプレッドシートの作成` ボタン（Googleスプレッドシートのアイコン）をクリックします
2. 回答先の選択ダイアログが表示されるので、 `新しいスプレッドシートを作成` にチェックして `作成` をクリックします。これでフォームへの回答がGoogleスプレッドシートに転記されるようになります

![_2020-10-12_15.05.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99585/1548421f-ee8e-30b1-4718-cda7a0e40153.png)

# 4. Googleスプレッドシートにスクリプトを設定する

連携したGoogleスプレッドシートを開き、 `ツール` - `スクリプト エディタ` をクリック。GASのエディターを開きます。

以下のコードをペーストします。その後、Googleフォームの内容に合わせてカスタマイズしていくことになります。

```js

const url = "https://webto.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8";
const oid = "xxxxxxxxxxxx";

function registerToLead(event) {
  UrlFetchApp.fetch(url, {
    method: "post",
    payload: {
      oid: oid,
      email: event.values[1],
      last_name: event.values[2],
      first_name: event.values[3], 
      company: event.values[4],
      title: event.values[5],
      description: event.values[6],
    }
  });
}
```

以下のポイントをWeb-to-リードのサンプルHTMLと見比べながら修正します。

```js

const url = "https://webto.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8";
const oid = "xxxxxxxxxxxx";
```

`url` は `<form action="https://~~~" method="POST">` のaction属性の値を使用します。おそらく全てのSalesforce組織で共通ですが、念のため確認してください。

`oid` は `<input type=hidden name="oid" value="xxxxxxxxxxxx">` のvalue属性の値を使用します。

```js
    payload: {
      oid,
      email: event.values[1],
      last_name: event.values[2],
      first_name: event.values[3], 
      company: event.values[4],
      title: event.values[5],
      description: event.values[6],
    }
```

`payload` にはSalesforceに送信する項目を設定します。 `event.value` はこの関数の引数ですが、「フォーム送信時」をトリガーに設定するとフォームの記述内容が配列で入ってきます。これと、Salesforceの項目名をマッピングしてあげます。

スクリプトができたら保存しておきます。

# 5. トリガーの設定

作成したスクリプトが自動実行されるようにトリガーを設定します。

1. スクリプトエディターの `編集` - `現在のプロジェクトのトリガー` をクリックします
2. `トリガーを追加` ボタンをクリックして、「（プロジェクト名）のトリガーを追加」ダイアログを表示します
3. 上から `registerToLead`, `Head`, `スプレッドシートから`, `フォーム送信時` に設定します。エラー通知の設定はお好みで。 `保存` を押して完成です

以上で、フォームで回答が送信されると、それがスプレッドシートに記載され、GASが動いてSalesforceへ登録される、という一連の流れを実装することが出来ました。実際にGoogleフォームに回答してみて動作を確認してみてください。うまく動かない場合には、構文エラーなどでGASで失敗しているケースと、項目名が間違っているなどでSalesforce側でエラーになっているケースの２パターンが考えられます。GASの画面やSalesforceからのエラー通知メールなどを確認しましょう。

# こんな使い方して大丈夫なの？

Web-to-リードの機能は便利ですが、組織ID( `oid` )を外部に晒す形になってしまうことから、この機能を利用したスパムが送られてくるというリスクがありました（現在はreCAPTCHAがあるので以前ほどのリスクではありません）。それに対して、Webフォームの内容を一旦別のサーバーで受けてセキュアにSalesforceと通信する方法が紹介されていましたので、Salesforce側も意図した使い方と思います。

=> Salesforceの営業さんにも確認しましたが、大丈夫みたいです。