集計済みデータから新規 Spread Sheet を作成する方法を模索して解決した

スプレッドシート愛好家の皆様のスプレッドシートライフがより豊かになりますように。

# やりたかったこと
- デイリーで集計している数値をスプレッドシートに書き込みたい
    - 数値を更にこねくりまわしたいとかね。あるよね。
- 日別に新しいスプレッドシートを作りたい
    - 日別っていうか都度新規シートつくって使い捨てるくらいのやつ

# 既存ライブラリを使えなかった理由
- ちょっと探してみたけどスプレッドシートの id とワークシートの id を必要とするものばかり
    - 新しく作る api とか対応されてない
    - でも v4 のドキュメントには [create](https://developers.google.com/sheets/reference/rest/v4/spreadsheets/create) の項目が存在する
        - でも api の叩き方よくわかんね()

# 解決方法
- Google Drive Api つかって csv もしくは tsv ファイルとしてアップロードする
    - ファイルの `mimeType` を `application/vnd.google-apps.spreadsheet` にしておく
    - アップロードするファイルの `mimeType` は `text/csv` にする
- DriveFile のパーミッションを必要な範囲に設定する

 

## ひどい雑なサンプルコード

```sh
$ composer req google/apiclient
$ touch app.php
```

```app.php
<?php

require __DIR__ . '/vendor/autoload.php';

// 適当な csv 用意
$csv = <<< EOD
id,name
1,bko
2,ako
3,sou
4,ulr
EOD;

// https://console.developers.google.com/apis/credentials から `OAuth クライアント ID` の認証情報作成して json をダウンロードしておく
$credential = '/PATH/TO/YOUR/CREDENTIAL.json';
$driveService = createDriveService($credential);

$file = upload($csv, $driveService);
changeFilePermission($file, $driveService);

echo sprintf("https://docs.google.com/spreadsheets/d/%s\n", $file->getId());

function createDriveService($credential) {
    $client = new \Google_Client();
    $client->setAuthConfig($credential);
    if ($client->isAccessTokenExpired()) {
        # この実装だと毎回きかれるね
        echo sprintf("authentication required: %s\n",
            $client->createAuthUrl('https://www.googleapis.com/auth/drive')
        );
        echo sprintf("set token: ");
        $token = fgets(STDIN, 4096);
        # 標準入力から受け取った $token で認証
        $client->authenticate($token);
    }
    return new \Google_Service_Drive($client);
}

function upload($csv, \Google_Service_Drive $driveService) {
    $meta = new \Google_Service_Drive_DriveFile([
        'name' => 'Sample Spreadsheet',
        'mimeType' => 'application/vnd.google-apps.spreadsheet',  # ここと
    ]);
    return $driveService->files->create($meta, [
        'data' => $csv,
        'mimeType' => 'text/csv', # ここがたいせつ(tsv アップロードするときも text/csv で)
        'uploadType' => 'multipart',
        'fields' => 'id',
    ]); 
}

function changeFilePermission(\Google_Service_Drive_DriveFile $file, \Google_Service_Drive $driveService) {
    $driveService->getClient()->setUseBatch(true);
    try {
        $batch = $driveService->createBatch();
        $permission = new \Google_Service_Drive_Permission([
            'type' => 'domain',
            'role' => 'writer',
            # 会社の Google Apps 利用ドメインを入力すると同僚もアクセスできる状態になるはず
            'domain' => 'YOUR_APPS_DOMAIN',

        ]);

        $request = $driveService->permissions->create(
            $file->getId(),
            $permission,
            ['fields' => 'id']
        );
        $batch->add($request, 'domain');
        $batch->execute();
    } finally {
        $driveService->getClient()->setUseBatch(false);
    }
}


```

じっこうしてみる

```
$ php app.php
```

<img width="967" alt="スクリーンショット_2016-07-27_23_45_04.png" src="https://qiita-image-store.s3.amazonaws.com/0/28612/538b7486-6b94-1230-62e0-516b8eee712c.png">

こんな感じで認証用 URL 表示されるのでアクセスして許可すると

<img width="545" alt="スクリーンショット_2016-07-27_23_46_45.png" src="https://qiita-image-store.s3.amazonaws.com/0/28612/6576cd0f-5a57-273f-651a-c37e570b7d74.png">

認証用のコードが発行されるのでこれをコピペすると

<img width="708" alt="スクリーンショット_2016-07-27_23_48_58.png" src="https://qiita-image-store.s3.amazonaws.com/0/28612/914fa1a8-fb27-f832-d237-3f57170fd446.png">

無事にスプレッドシートが作成されて URL が表示されます

<img width="605" alt="スクリーンショット 2016-07-27 23.50.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/28612/b9d8d849-23fe-a4e5-7b34-5410803b860d.png">


このようになったのでは！！！！

用途にあわせて認証周りをなんとかしてください。けっこういい感じにスプレッドシートを愛でることができるでしょう。

ぼくはこんな感じで
<img width="919" alt="スクリーンショット_2016-07-27_23_53_42.png" src="https://qiita-image-store.s3.amazonaws.com/0/28612/781f76d4-5c9f-7808-63ff-90cd7c660110.png">
開くボタンおしたらアイコンくるくるまわしてスプレッドシート作成できたら新規タブつくってひらくようにしたら超快適感演出できました。Google 先生ほんとうにありがとうございます。

~~でももうちょっとだけわかりやすいドキュメント用意してほしいな。マジで。~~


じゃあの。