集計済みデータから新規 Spread Sheet を作成する方法を模索して解決した
スプレッドシート愛好家の皆様のスプレッドシートライフがより豊かになりますように。
やりたかったこと
- デイリーで集計している数値をスプレッドシートに書き込みたい
- 数値を更にこねくりまわしたいとかね。あるよね。
- 日別に新しいスプレッドシートを作りたい
- 日別っていうか都度新規シートつくって使い捨てるくらいのやつ
既存ライブラリを使えなかった理由
- ちょっと探してみたけどスプレッドシートの id とワークシートの id を必要とするものばかり
- 新しく作る api とか対応されてない
- でも v4 のドキュメントには create の項目が存在する
- でも api の叩き方よくわかんね()
解決方法
- Google Drive Api つかって csv もしくは tsv ファイルとしてアップロードする
- ファイルの
mimeType
を application/vnd.google-apps.spreadsheet
にしておく
- アップロードするファイルの
mimeType
は text/csv
にする
- DriveFile のパーミッションを必要な範囲に設定する
ひどい雑なサンプルコード
$ 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);
}
}
- 数値を更にこねくりまわしたいとかね。あるよね。
- 日別っていうか都度新規シートつくって使い捨てるくらいのやつ
- ちょっと探してみたけどスプレッドシートの id とワークシートの id を必要とするものばかり
- 新しく作る api とか対応されてない
- でも v4 のドキュメントには create の項目が存在する
- でも api の叩き方よくわかんね()
解決方法
- Google Drive Api つかって csv もしくは tsv ファイルとしてアップロードする
- ファイルの
mimeType
を application/vnd.google-apps.spreadsheet
にしておく
- アップロードするファイルの
mimeType
は text/csv
にする
- DriveFile のパーミッションを必要な範囲に設定する
ひどい雑なサンプルコード
$ 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);
}
}
- ファイルの
mimeType
をapplication/vnd.google-apps.spreadsheet
にしておく - アップロードするファイルの
mimeType
はtext/csv
にする
$ composer req google/apiclient
$ touch 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
こんな感じで認証用 URL 表示されるのでアクセスして許可すると
認証用のコードが発行されるのでこれをコピペすると
無事にスプレッドシートが作成されて URL が表示されます
このようになったのでは!!!!
用途にあわせて認証周りをなんとかしてください。けっこういい感じにスプレッドシートを愛でることができるでしょう。
ぼくはこんな感じで
開くボタンおしたらアイコンくるくるまわしてスプレッドシート作成できたら新規タブつくってひらくようにしたら超快適感演出できました。Google 先生ほんとうにありがとうございます。
でももうちょっとだけわかりやすいドキュメント用意してほしいな。マジで。
じゃあの。
Author And Source
この問題について(集計済みデータから新規 Spread Sheet を作成する方法を模索して解決した), 我々は、より多くの情報をここで見つけました https://qiita.com/mojibakeo/items/1dae18ac2d0fda759842著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .