<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Google Drive &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/tag/google-drive/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.mach3.jp</link>
	<description></description>
	<lastBuildDate>Wed, 13 Aug 2025 06:02:36 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>Google APIs Client Library for PHP を使ってスプレッドシートを読み書きする（3）</title>
		<link>https://blog.mach3.jp/2015/09/18/google-spreadsheet-api-03.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Fri, 18 Sep 2015 10:32:36 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Google Drive]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Spreadsheet]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=4126</guid>

					<description><![CDATA[前回までは Google APIs Client Library for PHP を使って直接Googleスプレッドシートにアクセスしていましたが、 今回は読み書きを簡略化できるクライアントライブラリを書いてみました。  [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>前回までは Google APIs Client Library for PHP を使って直接Googleスプレッドシートにアクセスしていましたが、 今回は読み書きを簡略化できるクライアントライブラリを書いてみました。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-5cK6TgCsp0U/Vff-k7Z0c1I/AAAAAAAAC_A/77Y7KGEzqBc/s400-Ic42/2015-0915-00.png" alt="Google APIs Client Library for PHP を使ってスプレッドシートを読み書きする"/></figure>



<p></p>



<span id="more-4126"></span>



<h2 class="wp-block-heading">書いてみたもの</h2>



<p><a href="https://github.com/mach3/google-spreadsheet.php">mach3/google-spreadsheet.php @ GitHub</a></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Google Spreadsheet Client for PHP. This requires &#8220;google/apiclient&#8221; package.</p>
</blockquote>



<h3 class="wp-block-heading">導入方法</h3>



<p>Composer で導入出来ます。</p>


<pre class="wp-block-code"><span><code class="hljs language-json">{
    <span class="hljs-attr">"require"</span>: {
        <span class="hljs-attr">"mach3/google-spreadsheet"</span>: <span class="hljs-string">"*"</span>
    }
}
</code></span></pre>


<p>Composer を使わない場合は Github からソースをダウンロードしますが、 その場合は、<a href="https://github.com/google/google-api-php-client">google/google-api-php-client</a> に依存していますのでそちらも一緒に導入します。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="php"><span class="hljs-meta">&lt;?php</span>

<span class="hljs-comment">// Composer の場合</span>
<span class="hljs-keyword">require</span> <span class="hljs-string">"vendor/autoload.php"</span>;

<span class="hljs-comment">// ソースを直接ダウンロードした場合</span>
<span class="hljs-keyword">require</span> <span class="hljs-string">"the/path/to/google/apiclient/src/Google/autoload.php"</span>;
<span class="hljs-keyword">require</span> <span class="hljs-string">"the/path/to/google-spreadsheet/src/autoload.php"</span>;
</span></code></span></pre>


<h2 class="wp-block-heading">使い方</h2>



<p>今までの例と同様に鍵ファイルを使用して認証をしますので、 <a href="https://console.developers.google.com/">Google Developper Console</a> で鍵ファイルを生成しておきましょう。</p>



<h3 class="wp-block-heading">認証してスプレッドシートを開く</h3>



<p>シートを開いた時点でシート内のデータは取得されています。 なお、シートの1行目はヘッダ行としてフィールド名を連ねるようにしてください。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">// 鍵ファイルでクライアントを初期化</span>
$client = Google_Spreadsheet::getClient(<span class="hljs-string">"the/path/to/key.json"</span>);
<span class="hljs-comment">// スプレッドシートのIDでファイルを取得</span>
$file = $client-&gt;file(<span class="hljs-string">"XXXxxxXXXXxxxXXXX"</span>);
<span class="hljs-comment">// シートのタイトルでシートを取得</span>
$sheet = $file-&gt;sheet(<span class="hljs-string">"Sheet1"</span>);

var_dump($sheet-&gt;items);
</code></span></pre>


<h3 class="wp-block-heading">条件で行を選択する</h3>



<p>クロージャまたは配列で条件を指定してリストを取得します。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">// クロージャ</span>
$items = $sheet-&gt;select(<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">($row)</span></span>{
    <span class="hljs-keyword">return</span> $row&#91;<span class="hljs-string">"email"</span>] === <span class="hljs-string">"foo@example.com"</span>;
});
<span class="hljs-comment">// 配列</span>
$items = $sheet-&gt;select(<span class="hljs-keyword">array</span>(
    <span class="hljs-string">"id"</span> =&gt; <span class="hljs-number">23</span>
));
<span class="hljs-comment">// 条件がない場合は全部返ってきます</span>
$items = $sheet-&gt;select();
</code></span></pre>


<h3 class="wp-block-heading">行を追加する</h3>



<p>シートに新しい行を追加します。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$sheet-&gt;insert(<span class="hljs-keyword">array</span>(
    <span class="hljs-string">"name"</span> =&gt; <span class="hljs-string">"Bob"</span>,
    <span class="hljs-string">"age"</span> =&gt; <span class="hljs-number">23</span>,
    <span class="hljs-string">"email"</span> =&gt; <span class="hljs-string">"bob@example.com"</span>
));
</code></span></pre>


<h3 class="wp-block-heading">セルの値を変更する</h3>



<p>行番号と列番号（またはフィールド名）を指定して値を変更します。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">// 8行目の"name"の値を"Tom"に変更します</span>
$sheet-&gt;update(<span class="hljs-number">8</span>, <span class="hljs-string">"name"</span>, <span class="hljs-string">"Tom"</span>);

<span class="hljs-comment">// 8行目の2カラム目を"50"に変更します</span>
$sheet-&gt;update(<span class="hljs-number">8</span>, <span class="hljs-number">2</span>, <span class="hljs-number">50</span>);
</code></span></pre>


<h3 class="wp-block-heading">キャッシュを保存する</h3>



<p>サーバ上にファイルとしてキャッシュを保存する事ができます。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$client-&gt;config(<span class="hljs-keyword">array</span>(
    <span class="hljs-string">"cache"</span> =&gt; <span class="hljs-keyword">true</span>,
    <span class="hljs-string">"cache_dir"</span> =&gt; <span class="hljs-string">"cache"</span>,
    <span class="hljs-string">"cache_expires"</span> =&gt; <span class="hljs-number">3600</span>
));
</code></span></pre>


<h3 class="wp-block-heading">データを最新の情報に更新する</h3>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">// キャッシュを無視したい場合は引数にTRUEを渡します</span>
$sheet-&gt;fetch(<span class="hljs-keyword">true</span>);
</code></span></pre>


<h2 class="wp-block-heading">どこで使えるのか</h2>



<p>スプレッドシートをお手軽な簡易データベースとして使うことが出来ますが、 毎度リクエストを飛ばす関係でパフォーマンスはどうしても落ちてしまいます。 また、データを丸ごと引っ張って来ているので大きなデータを扱うのには全く適していません。</p>



<ul class="wp-block-list">
<li>サーバーの都合でデータベースが使用出来ない</li>



<li>データベースを使うほどのものではない</li>



<li>エクセルライクなインターフェースで簡単にコンテンツを更新したい！</li>
</ul>



<p>といったようなニーズにお応えする物でしょうか。 簡単なアンケート集計等にも使えるかもしれませんね。</p>



<h2 class="wp-block-heading">まとめ</h2>



<p>スプレッドシートについてはひとまずこれでやりきった感がありますね。 もっと便利なAPIの使い方があるかもしれないので、 都度ライブラリは改善していきたいと思っています。</p>



<p>良い使い道がある事を祈って。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Google APIs Client Library for PHP を使ってスプレッドシートを読み書きする（2）</title>
		<link>https://blog.mach3.jp/2015/09/17/google-spreadsheet-api-02.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Thu, 17 Sep 2015 07:28:10 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Google Drive]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Spreadsheet]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=4122</guid>

					<description><![CDATA[前回につづいて、Googleのライブラリを使ってスプレッドシートと連携する実験です。 軽いおさらい 前回は Google Developper Console で鍵ファイルを取得し、 それを使って認証してアクセストークン [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>前回につづいて、Googleのライブラリを使ってスプレッドシートと連携する実験です。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-5cK6TgCsp0U/Vff-k7Z0c1I/AAAAAAAAC_A/77Y7KGEzqBc/s400-Ic42/2015-0915-00.png" alt="Google APIs Client Library for PHP を使ってスプレッドシートを読み書きする"/></figure>



<p></p>



<span id="more-4122"></span>



<h2 class="wp-block-heading">軽いおさらい</h2>



<p>前回は <a href="https://console.developers.google.com">Google Developper Console</a> で鍵ファイルを取得し、 それを使って認証してアクセストークンを取得、 APIにリクエストを投げてスプレッドシートの情報を引っ張るところまでやりました。</p>



<p>以降のコードは下記の変数が宣言されている前提で書かれています。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$accessToken; <span class="hljs-comment">// アクセストークン文字列</span>
$listfeed; <span class="hljs-comment">// listfeedのURL</span>
$cellsfeed; <span class="hljs-comment">// cellsfeedのURL</span>
</code></span></pre>


<h2 class="wp-block-heading">シートのデータを取得する（listfeed）</h2>



<p><strong>listfeed</strong> はテーブルの内容を一行ずつまとめて出力する形式です。 セルの住所（A1, C6等）に特に興味がなく、とりあえず一覧用のデータが欲しい場合はこちらの形式が便利ですね。</p>



<p>先ほど取得しておいた <strong>&#8220;listfeed&#8221;</strong> のURLへ、同じ要領でリクエストを投げてみます。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$request = <span class="hljs-keyword">new</span> Google_Http_Request(
    $listfeed . <span class="hljs-string">"?alt=json"</span>,
    <span class="hljs-string">"GET"</span>,
    <span class="hljs-keyword">array</span>(<span class="hljs-string">"Authorization"</span> =&gt; <span class="hljs-string">"Bearer {$accessToken}"</span>)
);
$data = json_decode($curl-&gt;executeRequest($request)&#91;<span class="hljs-number">0</span>]);
</code></span></pre>


<p>例えば次のようなシートを読み込んだ場合…</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>name</th><th>age</th><th>email</th></tr></thead><tbody><tr><td>John</td><td>26</td><td>john@example.com</td></tr></tbody></table></figure>



<p>次のようなデータが返されます。</p>


<pre class="wp-block-code"><span><code class="hljs language-json">{
    <span class="hljs-attr">"feed"</span>: {
        <span class="hljs-attr">"entry"</span>: &#91;
            {
                <span class="hljs-attr">"title"</span>: {
                    <span class="hljs-attr">"type"</span>: <span class="hljs-string">"text"</span>,
                    <span class="hljs-attr">"$t"</span>: <span class="hljs-string">"john"</span>
                },
                <span class="hljs-attr">"content"</span>: <span class="hljs-string">"age:26, email:john@example.com"</span>
                <span class="hljs-string">"gsx$name"</span>: {<span class="hljs-attr">"$t"</span>: <span class="hljs-string">"John"</span>},
                <span class="hljs-attr">"gsx$age"</span>: {<span class="hljs-attr">"$t"</span>: <span class="hljs-string">"26"</span>},
                <span class="hljs-attr">"gsx$email"</span>: {<span class="hljs-attr">"$t"</span>: <span class="hljs-string">"john@example.com"</span>}
            }
        ]
    }
}
</code></span></pre>


<p><strong>&#8220;title&#8221;</strong> は1カラム目の情報が、<strong>&#8220;content&#8221;</strong> は2カラム以降の情報が &#8220;key:value, key:value&#8221; の形式で格納されますが、 とりあえずこれらは無視して、<strong>&#8220;gsx$&#8221;</strong> の接頭辞が付いている物だけを見ていけば十分でしょう。 接頭辞が邪魔で扱いづらい場合は加工してあげましょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">// データ加工の例</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">_parse_listfeed</span> <span class="hljs-params">($entries)</span></span>{
    $list = <span class="hljs-keyword">array</span>();
    <span class="hljs-keyword">foreach</span>($entries <span class="hljs-keyword">as</span> $entry){
        $item = <span class="hljs-keyword">array</span>();
        <span class="hljs-keyword">foreach</span>($entry <span class="hljs-keyword">as</span> $key =&gt; $value){
            <span class="hljs-keyword">if</span>(preg_match(<span class="hljs-string">'/^gsx\$(.+)$/'</span>, $key, $m)){
                $item&#91;$m&#91;<span class="hljs-number">1</span>]] = $value-&gt;{<span class="hljs-string">"\$t"</span>};
            }
        }
        array_push($list, $item);
    }
    <span class="hljs-keyword">return</span> $list;
}

$list = _parse_listfeed($data-&gt;feed-&gt;entry);
</code></span></pre>


<p>結果をJSONではなくXMLで取得した場合、gsx名前空間の要素を取得するのが少々面倒になります。</p>



<p>cf) <a href="/2010/12/14/various-xml-on-php.html">PHPでXMLの名前空間つきタグを読み込む色々 – Mach3.laBlog</a></p>



<h2 class="wp-block-heading">シートのデータを取得する（cellsfeed）</h2>



<p><strong>cellsfeed</strong> は、セルの値を1つずつ出力してくれる形式です。 <strong>listfeed</strong> のように一行ずつエントリーとしてまとめたい場合には加工が必要ですが、 行・列番号を取得しておきたい場合などにはこちらを使うと良いでしょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$request = <span class="hljs-keyword">new</span> Google_Http_Request(
    $cellsfeed . <span class="hljs-string">"?alt=json"</span>,
    <span class="hljs-string">"GET"</span>,
    <span class="hljs-keyword">array</span>(<span class="hljs-string">"Authorization"</span> =&gt; <span class="hljs-string">"Bearer {$accessToken}"</span>)
);
$data = json_decode($curl-&gt;executeRequest($request)&#91;<span class="hljs-number">0</span>]);
</code></span></pre>


<p>結果は次のようなデータが返されます。</p>


<pre class="wp-block-code"><span><code class="hljs language-json">{
    <span class="hljs-attr">"feed"</span>: {
        <span class="hljs-attr">"entry"</span>: &#91;
            {
                <span class="hljs-attr">"title"</span>: {
                    <span class="hljs-attr">"type"</span>: <span class="hljs-string">"text"</span>,
                    <span class="hljs-attr">"$t"</span>: <span class="hljs-string">"A1"</span>
                },
                <span class="hljs-attr">"content"</span>: {
                    <span class="hljs-attr">"type"</span>: <span class="hljs-string">"text"</span>,
                    <span class="hljs-attr">"$t"</span>: <span class="hljs-string">"name"</span>
                }
            }
        ]
    }
}
</code></span></pre>


<p><strong>&#8220;title&#8221;</strong> にはセルの住所、<strong>&#8220;content&#8221;</strong> にはその値が格納されています。 このエントリーが入力されているセルの数だけ羅列されます。</p>



<p>例えば、（あまり賢い選択とは言えませんが）このデータをリスト形式に整理してみましょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">// データ加工の例</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">_parse_cellsfeed</span> <span class="hljs-params">($entries)</span></span>{
    $fields = <span class="hljs-keyword">array</span>();
    $list = <span class="hljs-keyword">array</span>();

    <span class="hljs-keyword">foreach</span>($entries <span class="hljs-keyword">as</span> $entry){
        preg_match(<span class="hljs-string">"/^(&#91;A-Z]+)(\d+)$/"</span>, $entry-&gt;title-&gt;{<span class="hljs-string">"\$t"</span>}, $m);
        $content = $entry-&gt;content-&gt;{<span class="hljs-string">"\$t"</span>};
        $r = (int) $m&#91;<span class="hljs-number">2</span>];
        $c = $m&#91;<span class="hljs-number">1</span>];

        <span class="hljs-keyword">if</span>($r === <span class="hljs-number">1</span>){
            $fields&#91;$c] = $content;
            <span class="hljs-keyword">continue</span>;
        }
        <span class="hljs-keyword">if</span>(array_key_exists($c, $fields)){
            $list&#91;$r] = is_array($list&#91;$r]) ? $list&#91;$r] : <span class="hljs-keyword">array</span>();
            $list&#91;$r]&#91;$fields&#91;$c]] = $content;
        }
    }

    <span class="hljs-keyword">return</span> $list;
}

$list = _parse_cellsfeed($data-&gt;feed-&gt;entry);
</code></span></pre>


<h2 class="wp-block-heading">シートに新しいデータを追加する</h2>



<p>読み込みの次は、データの書き込みをしてみましょう。 <strong>listfeed</strong> のURLにXMLの本文付きでPOSTすると、新しい行が追加されます。</p>



<p>既存のテーブルに次のようなデータを追加してみましょう。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>name</th><th>age</th><th>email</th></tr></thead><tbody><tr><td>Tom</td><td>32</td><td>tom@example.com</td></tr></tbody></table></figure>



<p>本文の形式は <strong>&#8220;application/atom+xml&#8221;</strong> になります。 listfeed の読み込みの際に使用した <strong>gsx</strong>名前空間を活用して本文を作成しましょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$postBody = &lt;&lt;<span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">EOS</span>
&lt;<span class="hljs-attr">entry</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://www.w3.org/2005/Atom"</span> <span class="hljs-attr">xmlns:gsx</span>=<span class="hljs-string">"http://schemas.google.com/spreadsheets/2006/extended"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">gsx:name</span>&gt;</span>Tom<span class="hljs-tag">&lt;/<span class="hljs-name">gsx:name</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">gsx:age</span>&gt;</span>32<span class="hljs-tag">&lt;/<span class="hljs-name">gsx:age</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">gsx:email</span>&gt;</span>tom@example.com<span class="hljs-tag">&lt;/<span class="hljs-name">gsx:email</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">entry</span>&gt;</span>
EOS;
</span></code></span></pre>


<p>作成した本文と Content-Type ヘッダを付加してリクエストを投げます。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$request = <span class="hljs-keyword">new</span> Google_Http_Request(
    $listfeed
    <span class="hljs-string">"POST"</span>,
    <span class="hljs-keyword">array</span>(
        <span class="hljs-string">"Authorization"</span> =&gt; <span class="hljs-string">"Bearer {$accessToken}"</span>,
        <span class="hljs-string">"Content-Type"</span> =&gt; <span class="hljs-string">"application/atom+xml"</span>
    ),
    $postBody
);

$res = $curl-&gt;executeRequest($request);
</code></span></pre>


<p>成功するとシートの最後の行にデータが追加されます。</p>



<p><strong>&lt;, &gt;</strong> を含む値を扱う際、そのまま入力するとXMLの文法が不正になりますので、 <strong>htmlspecialchars</strong> 等を使って特殊文字を変換してあげると良いでしょう。</p>



<h2 class="wp-block-heading">行・列番号を指定してセルの値を更新する</h2>



<p>行単位ではなく、セル単位で値を変更する場合には <strong>cellsfeed</strong> を使用します。 データの追加と同じく、XMLの本文を作成してPOSTします。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$postBody = &lt;&lt;<span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">EOS</span>
&lt;<span class="hljs-attr">entry</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://www.w3.org/2005/Atom"</span> <span class="hljs-attr">xmlns:gs</span>=<span class="hljs-string">"http://schemas.google.com/spreadsheets/2006"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">gs:cell</span> <span class="hljs-attr">row</span>=<span class="hljs-string">"3"</span> <span class="hljs-attr">col</span>=<span class="hljs-string">"2"</span> <span class="hljs-attr">inputValue</span>=<span class="hljs-string">"33"</span>/&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">entry</span>&gt;</span>
EOS;
</span></code></span></pre>


<p>使用する名前空間は <strong>gs</strong> になります。ここでは、<strong>「3行目の2列目の値を&#8221;33&#8243;に変更」</strong>しています。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$request = <span class="hljs-keyword">new</span> Google_Http_Request(
    $cellsfeed,
    <span class="hljs-string">"POST"</span>,
    <span class="hljs-keyword">array</span>(
        <span class="hljs-string">"Authorization"</span> =&gt; <span class="hljs-string">"Bearer {$accessToken}"</span>,
        <span class="hljs-string">"Content-Type"</span> =&gt; <span class="hljs-string">"application/atom+xml"</span>
    ),
    $postBody
);

$res = $curl-&gt;executeRequest($request);
</code></span></pre>


<p>成功するとスプレッドシートのセルの内容が書き換えられます。こちらも値の特殊文字の変換はお忘れなきよう。</p>



<h2 class="wp-block-heading">めんどくさいですか？</h2>



<p>毎度こんな事をしているのは些か面倒なので、 この辺の処理を簡略化したライブラリを書いてみました。 次回はその紹介となります。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Google APIs Client Library for PHP を使ってスプレッドシートを読み書きする（1）</title>
		<link>https://blog.mach3.jp/2015/09/16/google-spreadsheet-api-01.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Wed, 16 Sep 2015 01:30:05 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Google Drive]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Spreadsheet]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=4118</guid>

					<description><![CDATA[以前より公開されたスプレッドシートの読み込みについて記事をしたためてまいりましたが、 拙作の Ghostsheet 等はスプレッドシートを公開しなければならない、書き込みが出来ないといった欠点がありました。 今回は、Go [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>以前より公開されたスプレッドシートの読み込みについて記事をしたためてまいりましたが、 拙作の <a href="http://mach3.github.io/ghostsheet/">Ghostsheet</a> 等はスプレッドシートを公開しなければならない、書き込みが出来ないといった欠点がありました。 今回は、Google製のPHPクライアントを利用して認証し、読み書きの実験を行ってみました。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-5cK6TgCsp0U/Vff-k7Z0c1I/AAAAAAAAC_A/77Y7KGEzqBc/s400-Ic42/2015-0915-00.png" alt="Google APIs Client Library for PHP を使ってスプレッドシートを読み書きする"/></figure>



<p></p>



<span id="more-4118"></span>



<h2 class="wp-block-heading">下準備</h2>



<p>まず必要な物をまとめます。</p>



<ol class="wp-block-list">
<li>サービスアカウントの鍵ファイル</li>



<li>1のアカウントに編集権限を与えたスプレッドシート</li>



<li>Google製のクライアント（PHP）</li>
</ol>



<h3 class="wp-block-heading">サービスアカウントの鍵ファイル</h3>



<ol class="wp-block-list">
<li><a href="https://console.developers.google.com">Google Developper Console</a> でプロジェクトを作成します。</li>



<li>「認証情報」→「認証情報の追加」から「サービスアカウント」を選択</li>



<li>鍵ファイルをJSON形式で取得します。</li>
</ol>



<p>このファイルは認証情報が記載されている大変重要なファイルなので、 サーバー上に設置する際には公開される状態にしないように配慮しましょう。</p>



<h3 class="wp-block-heading">新規スプレッドシートの作成</h3>



<ol class="wp-block-list">
<li><a href="https://drive.google.com">Google Drive</a> で新しいスプレッドシートを作成します。</li>



<li>前工程の鍵ファイル内の「client_email」のメールアドレスに「編集者」の権限を与えます</li>



<li>アドレスバーからスプレッドシートのIDをコピーしておきます</li>
</ol>



<h3 class="wp-block-heading">google/apiclient のインストール</h3>



<p>ここでは認証に <a href="https://github.com/google/google-api-php-client">google-api-php-client</a> を使用します。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>Google APIs Client Library for PHP</strong><br />
  The Google API Client Library enables you to work with Google APIs such as Google+, Drive, or YouTube on your server.</p>
</blockquote>



<p><a href="https://getcomposer.org/">Composer</a> でインストールするか、直接ソースをダウンロードするかお好みでどうぞ。</p>



<p><strong>Composer の場合</strong></p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-built_in">require</span> <span class="hljs-string">"vendor/autoload.php"</span>;
</code></span></pre>


<p><strong>直接ダウンロードして設置した場合</strong></p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-built_in">require</span> <span class="hljs-string">"the/path/to/google-api-php-client/src/Google/autoload.php"</span>;
</code></span></pre>


<h2 class="wp-block-heading">認証してアクセストークンを取得する</h2>



<p>APIにリクエストを投げるにはアクセストークンが必要なので、 まずはこれを取得します。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">// クライアントを新たに生成</span>
$client = <span class="hljs-keyword">new</span> Google_Client();
$client-&gt;setApplicationName(<span class="hljs-string">"DemoApp"</span>);
<span class="hljs-comment">// 証明書を生成して</span>
$credentials = $client-&gt;loadServiceAccountJson(<span class="hljs-string">"./keys.json"</span>, <span class="hljs-keyword">array</span>(
    Google_Service_Drive::DRIVE
));
<span class="hljs-comment">// クライアントに読ませる</span>
$client-&gt;setAssertionCredentials($credentials);

<span class="hljs-comment">// アクセストークンをリフレッシュする</span>
$client-&gt;getAuth()-&gt;refreshTokenWithAssertion();
<span class="hljs-comment">// アクセストークンを取得</span>
$accessTokenJson = $client-&gt;getAccessToken();
$accessToken = json_decode($accessTokenJson)-&gt;access_token;
</code></span></pre>


<p>本来ならばこのアクセストークンはセッションに保存して再利用するのですが、 ここでは例をシンプルにするためにそのくだりは省いています。</p>



<h2 class="wp-block-heading">スプレッドシートファイルの情報を取得する</h2>



<p>google/apiclientにスプレッドシートを色々触れるAPIが用意されていればよかったのですが、 ちょっと見当たらなかったので、<strong>Google_Http_Request</strong> と <strong>Google_IO_Curl</strong> を使って直接リクエストを飛ばします。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$sheet_id = <span class="hljs-string">"XXXxxxXX-XXXxxxxxXXXXXX"</span>;
$request = <span class="hljs-keyword">new</span> Google_Http_Request(
    <span class="hljs-string">"https://spreadsheets.google.com/feeds/worksheets/{$sheet_id}/private/full?alt=json"</span>,
    <span class="hljs-string">"GET"</span>,
    <span class="hljs-keyword">array</span>(<span class="hljs-string">"Authorization"</span> =&gt; <span class="hljs-string">"Bearer {$accessToken}"</span>)
);
$curl = <span class="hljs-keyword">new</span> Google_IO_Curl($client);
$res = $curl-&gt;executeRequest($request);

$data = json_decode($res&#91;<span class="hljs-number">0</span>]);
</code></span></pre>


<p>URLに <strong>alt=json</strong> パラメータを付加しておくことでJSONでレスポンスが返ってくるので、デコードしましょう。 （デフォルトではAtomなのですが、PHPでは少々扱いづらい為JSONにしています）</p>



<p>かなり多くの情報が格納されているので目が回りそうですが、 スプレッドシートAPIでは共通して、概ね必要な情報は <strong>&#8220;feed&#8221;</strong> オブジェクト内の <strong>&#8220;entry&#8221;</strong> の中に入っています。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-string">"entry"</span>: &#91;
    {
        <span class="hljs-string">"id"</span>: {...},
        <span class="hljs-string">"category"</span>: {...},
        <span class="hljs-string">"title"</span>: {...},
        <span class="hljs-string">"content"</span>: {...},
        <span class="hljs-string">"link"</span>: {...},
        ...
    }
]
</code></span></pre>


<p>こんな感じの構造になっていて、 <strong>&#8220;entry&#8221;</strong> の中にはそのスプレッドシートに含まれるシートの数だけオブジェクトが連ねてあります。 ここで肝になるのは <strong>&#8220;link&#8221;</strong> の部分で、それぞれのシートを読み書きする際にリクエストを飛ばすエンドポイントURLが記されています。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-string">"link"</span>: &#91;
    {
        <span class="hljs-string">"rel"</span>: <span class="hljs-string">"http://schemas.google.com/spreadsheets/2006#listfeed"</span>,
        <span class="hljs-string">"type"</span>: <span class="hljs-string">"application/atom+xml"</span>,
        <span class="hljs-string">"href"</span>: <span class="hljs-string">"https://spreadsheets.google.com/feeds/list/XXXxxxXX-XXXxxxxxXXXXXX/od6/private/full"</span>
    },
    {
        <span class="hljs-string">"rel"</span>: <span class="hljs-string">"http://schemas.google.com/spreadsheets/2006#cellsfeed"</span>,
        <span class="hljs-string">"type"</span>: <span class="hljs-string">"application/atom+xml"</span>,
        <span class="hljs-string">"href"</span>: <span class="hljs-string">"https://spreadsheets.google.com/feeds/cells/XXXxxxXX-XXXxxxxxXXXXXX/od6/private/full"</span>
    },
    ...
]
</code></span></pre>


<p>読み書きに必要な <strong>&#8220;listfeed&#8221;</strong> と <strong>&#8220;cellsfeed&#8221;</strong> を変数等に格納しておきましょう。</p>



<h2 class="wp-block-heading">続きは次回</h2>



<p>今回はスプレッドシートの情報を取得する所までこぎつけました。 次回はいよいよ実際に読み書きの処理を行ってみます。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>新しくなったスプレッドシートと簡易データベース化</title>
		<link>https://blog.mach3.jp/2014/07/29/ghostsheet2.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 29 Jul 2014 06:11:18 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Google Drive]]></category>
		<category><![CDATA[Grunt]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Spreadsheet]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=3862</guid>

					<description><![CDATA[いつであったかあまり記憶は定かではないですが、去年ぐらいに Google スプレッドシートが新しくアップデートされました。 今回は、新しい Google スプレッドシートでも旧バージョンと同じようにAjaxで簡易データベ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>いつであったかあまり記憶は定かではないですが、去年ぐらいに Google スプレッドシートが新しくアップデートされました。 今回は、新しい Google スプレッドシートでも旧バージョンと同じようにAjaxで簡易データベース化出来ないかと考えてみた話です。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/--dZVIvAjb_M/U9c2b8IXzcI/AAAAAAAAChE/rZNY_b3qe0o/s400/2014-0729-00.png" alt="新しくなったスプレッドシートと簡易データベース化"/></figure>



<p></p>



<span id="more-3862"></span>



<h2 class="wp-block-heading">新しくなった Google スプレッドシート</h2>



<p>今までは個人設定をいじる事で旧バージョンのスプレッドシートを使い続ける事ができたのですが、 先日からそのオプションが設定画面から消えていて、特別な方法をとらないと<strong>旧バージョンのスプレッドシートを新規作成出来なくなりました</strong>。 （すでに作成したスプレッドシートは変更されない様です）</p>



<p>刷新された Google スプレッドシートにどのような素晴らしい機能が追加されたかは未だあまり把握していませんが、 現状で確かな事は、<del style="text-decoration:line-through">旧バージョンで使えたRSSやJSONでの公開APIが実装されていないという事です。 今後実装されるかどうかはわかりません。</del></p>



<p><a href="/2013/06/04/spreadsheet-as-db-for-php-ajax.html">以前書いたGhostsheet</a>はそれらの公開APIを利用した物だったので、<del style="text-decoration:line-through">新しいスプレッドシートでは使用する事ができません</del>。</p>



<dl>
<dt>2014/11/20 追記</dt>
<dd>現在ではAPIが整備された様で、新しいスプレッドシートでも旧Ghostsheetが正常に動作する事を確認しました。<br />
<a href="https://blog.mach3.jp/2013/06/04/spreadsheet-as-db-for-php-ajax.html">Googleスプレッドシートを簡易DBとして利用する -　PHP+Ajax編</a></dd>
</dl>



<h2 class="wp-block-heading">Ghostsheet も新しくしました</h2>



<p>とはいえ、pubhtml（Webページの公開）APIは利用可能なので、それをスクレイピングしてデータ化する物を新たに書きました。 全く別物になったのでリポジトリも改めています。</p>



<ul class="wp-block-list">
<li><a href="https://github.com/mach3/ghostsheet2">mach3/ghostsheet2 @ GitHub</a></li>
</ul>



<h3 class="wp-block-heading">簡単な使い方</h3>



<p>以前と同様に、スプレッドシートを作成して「Webに公開」します。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>name</th><th>age:integer</th><th>email</th><th>active:bool</th></tr></thead><tbody><tr><td>John</td><td>23</td><td>john@example.com</td><td>true</td></tr><tr><td>Tom</td><td>18</td><td>tom@example.com</td><td>false</td></tr></tbody></table></figure>



<p>一行目のヘッダ部分でデータの型を指定する事が出来ます。 上記にある <strong>integer</strong>、<strong>bool</strong> の他に、<strong>float</strong>、<strong>json</strong> が利用出来ます。 省略時は <strong>string</strong> になります。</p>



<p>そしてスプレッドシートのキーをメモしておきます。スプレッドシートのキーはURLの下記太文字の箇所になります。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
https://docs.google.com/spreadsheets/d/00X_xxxXX_0xXxxXx00XXXxx-xxXXxX0-XxXxXx0XxxX/edit#gid=0
</div></figure>
</blockquote>



<p>このキーをそのまま引数にしてメソッドの呼び出しをします。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="php"><span class="hljs-meta">&lt;?php</span>

<span class="hljs-keyword">require</span> <span class="hljs-string">"the/path/to/ghostsheet/phplib/Ghostsheet.php"</span>;

$gs = <span class="hljs-keyword">new</span> Ghostsheet();
$gs-&gt;config(<span class="hljs-string">"cache_dir"</span>, <span class="hljs-string">"./cache"</span>);
$data = $gs-&gt;load(<span class="hljs-string">"00X_xxxXX_0xXxxXx00XXXxx-xxXXxX0-XxXxXx0XxxX"</span>);
var_dump($data);
</span></code></span></pre>


<p>結果は連想配列で返され、&#8221;sheets&#8221; の中に各シートのデータが格納されるようになっています。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">array</span>(<span class="hljs-number">3</span>) {
  &#91;<span class="hljs-string">"title"</span>]=&gt;
  string(<span class="hljs-number">4</span>) <span class="hljs-string">"My Spreadsheet"</span>
  &#91;<span class="hljs-string">"key"</span>]=&gt;
  string(<span class="hljs-number">44</span>) <span class="hljs-string">"00X_xxxXX_0xXxxXx00XXXxx-xxXXxX0-XxXxXx0XxxX"</span>
  &#91;<span class="hljs-string">"sheets"</span>]=&gt;
  <span class="hljs-keyword">array</span>(<span class="hljs-number">2</span>) { ... }
}
</code></span></pre>


<h3 class="wp-block-heading">旧版との大きな違い</h3>



<p>旧版ではスプレッドシートに含まれるシート名で引くためには複数回リクエストしなければなりませんでしたが、 pubhtmlでは全てのシートがひとつのWebページで公開される為、一回のリクエストで済みます。 あまり大量のデータになると辛そうですが、そういった大きなデータでは利用すべきではないと思うので、 結果的には効率が良くなったと言えそうです。</p>



<h3 class="wp-block-heading">メソッドの使い分け</h3>



<p>Ghostsheet にはデータを取得する為に4つのメソッドがあります。</p>



<ul class="wp-block-list">
<li><strong>load</strong>
<ul class="wp-block-list">
<li>キャッシュファイルが期限切れでなければそれを使用</li>



<li>そうでなければリモートから最新のデータを取得し、キャッシュファイルを更新</li>
</ul>
</li>



<li><strong>cache</strong>
<ul class="wp-block-list">
<li>キャッシュの生死に関わらずキャッシュのデータを返す</li>
</ul>
</li>



<li><strong>fetch</strong>
<ul class="wp-block-list">
<li>キャッシュの生死に関わらずリモートからデータを取得</li>



<li>キャッシュの更新は行わない</li>
</ul>
</li>



<li><strong>update</strong>
<ul class="wp-block-list">
<li>キャッシュの生死に関わらずリモートからデータを取得</li>



<li>キャッシュの更新を行う</li>
</ul>
</li>
</ul>



<p>一見すると <strong>load</strong> で良さそうですが、その場合、キャッシュの期限が切れるたびにレスポンスが遅くなるタイミングが出てきてしまいます。 対策としてはデータの取得は常にキャッシュから行い、非同期で <strong>load</strong> を呼び出すのがレスポンスに優しそうです。</p>



<h3 class="wp-block-heading">（おまけ） Gruntタスク</h3>



<p>おまけ機能としてGruntタスクをつけておきました。 スプレッドシートのデータを引っ張ってJSONファイルとしてローカルに保存するだけの簡単な物です。 シートのデータを元に静的サイトをジェネレートしたい場合などに使えたり、使えなかったり。</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">grunt</span><span class="hljs-selector-class">.initConfig</span>({
    <span class="hljs-attribute">ghostsheet</span>: {
        dev: {
            files: {
                <span class="hljs-string">"./data/mydata.json"</span>: <span class="hljs-string">"00X_xxxXX_0xXxxXx00XXXxx-xxXXxX0-XxXxXx0XxxX"</span>
            }
        }
    }
});

<span class="hljs-selector-tag">grunt</span><span class="hljs-selector-class">.loadNpmTasks</span>("<span class="hljs-selector-tag">ghostsheet2</span>");
</code></span></pre>


<h2 class="wp-block-heading">まとめ</h2>



<p>わりと力技なパースなので、できれば用意されたAPIを使いたい気持ちもありますが…</p>



<p>ちなみに一応旧版でも新規作成する方法は残されていて、下記指定のURLにアクセスするだけで可能です。 旧版のデータが残されている以上、当面は使えそうです。</p>



<ul class="wp-block-list">
<li><a href="https://g.co/oldsheets">https://g.co/oldsheets</a></li>
</ul>



<p>cf) <a href="https://support.google.com/docs/answer/3541068?hl=ja">新しい Google スプレッドシートについて &#8211; ドキュメント エディタ ヘルプ</a></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
