TransmitMail 2 で入力内容を Google スプレッドシートに保存する

[TransmitMail 2](https://github.com/dounokouno/TransmitMail) で入力内容を Google スプレッドシートに保存するカスタマイズ例をご紹介します。

# 開発および動作確認環境

開発および動作確認環境は下記の通りです。

- TransmitMail: 2.0.0
- PHP: 5.6.10

# `input.html` に入力フィールドを追加する

`input.html` に下記のような入力フィールドを追加します。

```html:input.html
<table>
    <tr>
        <th>お名前</th>
        <td><input type="text" name="お名前" value="{$お名前}"></td>
    </tr>
    <tr>
        <th>年齢</th>
        <td><input type="text" name="年齢" value="{$年齢}"></td>
    </tr>
    <tr>
        <th>メールアドレス</th>
        <td><input type="text" name="メールアドレス" value="{$メールアドレス}"></td>
    </tr>
</table>
```

# Google Developers Console の設定をする

## プロジェクトの作成

下記 URL にアクセスして、プロジェクトを作成します。

https://console.developers.google.com/project

![](https://qiita-image-store.s3.amazonaws.com/0/43927/ddd7ed6d-392d-78d6-f776-c7b52eb26ac5.png)

![](https://qiita-image-store.s3.amazonaws.com/0/43927/4dd9f71f-3a0c-dd3c-4777-f8ad4402e71f.png)

「プロジェクト名」と「プロジェクト ID」は任意の名前を設定します。

## Google API の設定

![](https://qiita-image-store.s3.amazonaws.com/0/43927/82641fc6-5eaf-89d4-a75a-76de63f887a6.png)

「Google API を利用する」をクリックします。

![](https://qiita-image-store.s3.amazonaws.com/0/43927/ff2df669-2ed4-2d4c-b741-c153d2cd3b2e.png)

「Drive API」で検索をして、「Drive API」リンクをクリックします。

![](https://qiita-image-store.s3.amazonaws.com/0/43927/a50f7f1d-9a1b-e66f-68f5-530db93d33a9.png)

「API を有効にする」ボタンをクリックします。

![](https://qiita-image-store.s3.amazonaws.com/0/43927/3804ce38-f36f-d50a-3520-72366993e2f5.png)

「認証情報」->「認証情報の追加」->「サービスアカウント」をクリックします。

![](https://qiita-image-store.s3.amazonaws.com/0/43927/d28d7b1c-fc73-7e2b-1136-2facb1a6f785.png)

「P12」を選択して、「作成」ボタンをクリックする。

![](https://qiita-image-store.s3.amazonaws.com/0/43927/a91ad185-3140-4a6d-740a-259e61eaf660.png)

「xxx.p12」という名前のファイルがダウンロードされるので、 `config` ディレクトリ以下に配置します。

![](https://qiita-image-store.s3.amazonaws.com/0/43927/8730f51b-685a-ef79-b4cb-fa7614a042f9.png)

![](https://qiita-image-store.s3.amazonaws.com/0/43927/3e373a75-68e0-52ca-e786-d20871968e8f.png)

「メールアドレス」をクリックすると「クライアント ID」が確認できます。

「メールアドレス」と「クライアント ID」はあとで必要になるので、メモしておきます。

# Google スプレッドシートを用意する

入力フィールドにあわせて下記のような Google スプレッドシートを用意します。

![](https://qiita-image-store.s3.amazonaws.com/0/43927/e680c421-7863-ab44-fa4e-3faf8734e13d.png)

# スプレッドシートに権限を追加する

画面右上の「共有」ボタンをクリックして、共有設定画面を開きます。

![](https://qiita-image-store.s3.amazonaws.com/0/43927/7faa4fbc-9370-85b7-0d31-81faeb230652.png)

「Google API の設定」でメモしたメールアドレスに「編集者」権限を与えます。

# `composer.json` を作成する

`composer.json` を作成して必要なパッケージを記述します。（Composer については、詳しくはググってください。）

```json:composer.json
{
    "require": {
        "asimlqt/php-google-spreadsheet-client": "2.3.*",
        "google/apiclient": "1.1.2"
    }
}
```

`composer install` を実行して、パッケージをインストールします。

```console
$ composer install
```

# 設定情報を `config.yml` に追加する

各種設定情報を `config/config.yml` に追加します。

```yaml:config/config.yml
config:
    google_client_id: {クライアント ID}
    google_client_email: {メールアドレス}
    google_client_key: {P12 ファイルのファイル名}
    google_client_key_password: notasecret
```

# `exTransmitMail.php` を作成する

`TransmiMail` クラスを継承した `exTransmiMail` クラスを `lib/exTransmitMail.php` に作成します。

```php:lib/exTransmitMail.php
<?php
class exTransmitMail extends TransmitMail
{
}
```

# exTransmitMail クラスに機能を実装する

メール送信のあとの処理となる `afterSetTemplateAndSendMail` メソッドを追加し、そこに処理を書いていきます。（ `afterXXX` メソッドについては [Wiki](https://github.com/dounokouno/TransmitMail/wiki/TransmitMail-%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E5%90%84%E5%87%A6%E7%90%86%E3%81%AE%E5%AE%9F%E8%A1%8C%E9%A0%86%E7%95%AA%EF%BC%88v2%EF%BC%89) をご参照ください。）

```php:lib/exTransmitMail.php
/**
 * メール送信のあとの処理
 */
public function afterSetTemplateAndSendMail()
{
    if ($this->page_name === 'finish') {
        require_once('vendor/autoload.php');

        $google_client = new Google_Client();
        $google_client->setApplicationName('TransmitMail');
        $google_client->setClientId($this->config['google_client_id']);
        $google_client->setAssertionCredentials(
            new Google_Auth_AssertionCredentials(
                $this->config['google_client_email'],
                ['https://spreadsheets.google.com/feeds','https://docs.google.com/feeds'],
                file_get_contents(dirname(__FILE__) . '/../config/' . $this->config['google_client_key']),
                $this->config['google_client_key_password']
            )
        );

        $google_client->getAuth()->refreshTokenWithAssertion();
        $token  = json_decode($google_client->getAccessToken());
        $access_token = $token->access_token;

        $service_request = new Google\Spreadsheet\DefaultServiceRequest($access_token);
        Google\Spreadsheet\ServiceRequestFactory::setInstance($service_request);

        $spreadsheet_service = new Google\Spreadsheet\SpreadsheetService();
        $spreadsheet_feed = $spreadsheet_service->getSpreadsheets();

        $spreadsheet = $spreadsheet_feed->getByTitle('TransmitMailの入力内容を保存するスプレッドシート');
        $worksheet_feed = $spreadsheet->getWorksheets();
        $worksheet = $worksheet_feed->getByTitle('シート1');
        $list_feed = $worksheet->getListFeed();

        $row = [
            'お名前' => $this->post['お名前'],
            '年齢' => $this->post['年齢'],
            'メールアドレス' => $this->post['メールアドレス'],
            '登録日' => date('Y/m/d H:i:s')
        ];

        $list_feed->insert($row);
    }
}
```

# `index.php` を修正する

`index.php` に `lib/exTransmitMail.php` の読み込みと `TransmitMail` クラスではなく `exTransmitMail` クラスを利用するように修正します。

```php:index.php
<?php
require_once 'lib/TransmitMail.php';
require_once 'lib/exTransmitMail.php';
$tm = new exTransmitMail('config/config.yml');
$tm->run();
```

# 動作確認

スプレッドシートに「お名前」「年齢」「メールアドレス」「登録日」が挿入されていることが確認できました。

![](https://qiita-image-store.s3.amazonaws.com/0/43927/c9517bd0-1183-3755-ef72-fa7070536b98.png)

# まとめ

以上、 TransmitMail 2 で入力内容を Google スプレッドシートに保存するカスタマイズ例をご紹介でした。TransmitMail 2 は Google スプレッドシートへの保存も実装しやすくなりました。

今回のカスタマイズのコードは下記ブランチで公開をしています。

[dounokouno/TransmitMail at example_google_spreadsheet](https://github.com/dounokouno/TransmitMail/tree/example_google_spreadsheet)

修正ファイルは下記のコミットをご参照ください。

[入力内容を Google スプレッドシートに保存するカスタマイズ例 · dounokouno/TransmitMail@779ef09](https://github.com/dounokouno/TransmitMail/commit/779ef090b1b939a449f41e8ab14dd2ed4ae38204)

# 参考

- [PHPでGoogle Spreadsheetにデータ投入してみる - Qiita]( http://qiita.com/kenji0302/items/efbdb159130302a90143#google-developers-console-%E3%81%A7%E3%81%AE%E8%A8%AD%E5%AE%9A)