<?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>Spreadsheet &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/tag/spreadsheet/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>
		<item>
		<title>Googleスプレッドシートを簡易DBとして利用する -　PHP+Ajax編</title>
		<link>https://blog.mach3.jp/2013/06/04/spreadsheet-as-db-for-php-ajax.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 04 Jun 2013 01:32:29 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Spreadsheet]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=3114</guid>

					<description><![CDATA[このお題は以前にも何度か関連記事を書いていますが、 いずれの方法もパフォーマンスがあまり良くなかったり、安定性に問題があるなどしました。 今回はその辺を解決する為のライブラリを考えてみるお話です。 「新しくなったスプレッ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>このお題は以前にも何度か関連記事を書いていますが、 いずれの方法もパフォーマンスがあまり良くなかったり、安定性に問題があるなどしました。 今回はその辺を解決する為のライブラリを考えてみるお話です。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-b119hG32ePU/Uaya83uGA_I/AAAAAAAACEc/uPRWuhOEpX8/s400/20130603-00.png" alt="Googleスプレッドシートを簡易DBとして利用する -　PHP+Ajax編"/></figure>



<p></p>



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



<ol class="wp-block-list">
<li>やりたい事</li>



<li>書いてみたもの</li>



<li>基本的な使い方</li>



<li>Ajaxで利用する</li>



<li>JSONPで利用する</li>



<li>その他オプション・機能など</li>



<li>必ず気をつけなければならないこと</li>



<li>まとめ : Googleスプレッドシートの活用について</li>
</ol>



<p class="caution">
  「<a href="/2014/07/29/ghostsheet2.html">新しくなったスプレッドシートと簡易データベース化</a>」でGhostsheetが使えなくなったと書きましたが、新スプレッドシートでもAPIが整備された様で、2014年11月20日現在では正常に動作する事を確認しています。但し、スクリーンショット類は古い物なのでご注意ください。（スプレッドシートIDの取得はURLを参照されるのが良いでしょう）
</p>



<h2 class="wp-block-heading">やりたい事</h2>



<ul class="wp-block-list">
<li>Googleスプレッドシートからデータを利用して展開したい</li>



<li>データは分かりやすい形に加工しておきたい</li>



<li>直接JSONで読めるけど、毎回読みに行くのは非効率なのでなんとかしたい</li>



<li>スプレッドシートがメンテ中の時も対応したい</li>
</ul>



<p>つまり、サーバ上に加工したデータをキャッシュとして保存しておけば良いわけですね。</p>



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



<h3 class="wp-block-heading"><a href="http://mach3.github.io/ghostsheet/">Ghostsheet by mach3</a></h3>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-pr-h46UEJYA/Uaya84RKCmI/AAAAAAAACEc/pu9nQ2r6_Ps/s500/20130603-01.png" alt="Ghostsheet"/></figure>



<p><a href="http://mach3.github.io/ghostsheet/">  </a></p>



<p>今回はPHPで書いてみました。こんな感じにはたらきます。</p>



<ol class="wp-block-list">
<li>渡されたIDを頼りにスプレッドシートをJSONで読み込んできます</li>



<li>加工したデータをキャッシュに保存し、返します</li>



<li>二回目以降のリクエストは、キャッシュの期限内であればキャッシュから返します</li>



<li>キャッシュが期限切れならば再度リモートから読み込んできます</li>
</ol>



<h2 class="wp-block-heading">基本的な使い方</h2>



<h3 class="wp-block-heading">1. スプレッドシートを作る</h3>



<p><a href="https://drive.google.com/">Googleドライブ</a> で、簡易DBにするスプレッドシートを作成します。 一行目はフィールドのキーで構成されるヘッダ行にします。これらのキーを元にデータは加工されます。</p>



<p><iframe width="600" height="200" frameborder="0" src="https://docs.google.com/spreadsheet/pub?key=0Ark6jIWYcmkLdGtva1M4elh4SHFrM3FaM1pVNGJ1QWc&amp;output=html&amp;widget=true"></iframe></p>



<p>キーの末尾に書かれている <em>:integer</em> 等の文字は、値の型です。 これを指定しておくと、データを加工する際に値をその型にキャストするように頑張ってくれます。 省略時の初期設定は&#8221;string&#8221;です。 &#8220;integer&#8221;, &#8220;boolean&#8221;, &#8220;float&#8221;等が使用できるほか、&#8221;array&#8221; ではカンマで区切った配列が、 &#8220;json&#8221; ではJSON文字列としてパースされた結果が格納されます。</p>



<h3 class="wp-block-heading">2. スプレッドシートを公開 &amp; IDを取得する</h3>



<p>「ファイル」→「ウェブに公開」でシートの公開設定ができます。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh5.googleusercontent.com/-CamIwrT18Bo/Uaya8yPN2DI/AAAAAAAACEc/9OFxyke1FoE/s518/20130603-02.png" alt="ウェブに公開"/></figure>



<p></p>



<ol class="wp-block-list">
<li>「公開開始」ボタンを押して公開します</li>



<li>「公開データへのリンクを取得」で「RSS」を選択します。</li>
</ol>



<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://spreadsheets.google.com/feeds/list/XXxxxxXXXxxxXx/od6/public/basic?alt=rss
</div></figure>
</blockquote>



<p>太文字の &#8220;XXxxxxXXXxxxXx/od6&#8221; にあたる部分をコピーします。 これはこの後スプレッドシートのIDとして使用されます。</p>



<h3 class="wp-block-heading">3. Ghostsheetで読み込む</h3>



<p>Ghostsheet.php を任意の場所に設置してrequireし、初期化してスプレッドシートを読み込みます。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">require</span> <span class="hljs-string">"Ghostsheet.php"</span>;

$gs = <span class="hljs-keyword">new</span> Ghostsheet();

<span class="hljs-comment">// キャッシュ用のディレクトリを設定しておきます</span>
<span class="hljs-comment">// config() で配列を渡すこともできます</span>
$gs-&gt;set(<span class="hljs-string">"cacheDir"</span>, <span class="hljs-string">"./gscache/"</span>);

$mySpreadsheetId = <span class="hljs-string">"XXxxxxXXXxxxXx/od6"</span>;
$data = $gs-&gt;load($mySpreadsheetId); <span class="hljs-comment">// $dataに加工されたデータが格納されます</span>
</code></span></pre>


<p>あとは、読み込まれたデータを好きな様に料理してください。</p>



<h2 class="wp-block-heading">Ajaxで利用する</h2>



<p>Ghostsheetには、Ajaxで簡単に利用する為の <code>ajax()</code> メソッドが用意されています。 <code>ajax()</code> は引数の配列（省略時のデフォルトは <code>$_GET</code>）を使用して処理し、JSON形式でレスポンスを返します。</p>



<h3 class="wp-block-heading">ajax.php</h3>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">require</span> <span class="hljs-string">"Ghostsheet.php"</span>;

$gs = <span class="hljs-keyword">new</span> Ghostsheet();
$gs-&gt;set(<span class="hljs-string">"cacheDir"</span>, <span class="hljs-string">"./gscache/"</span>);
$gs-&gt;ajax();
</code></span></pre>


<h3 class="wp-block-heading">jQueryによる読み込み例</h3>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$.getJSON(<span class="hljs-string">"ajax.php"</span>, {
    <span class="hljs-attr">id</span> : <span class="hljs-string">"XXxxxxXXXxxxXx/od6"</span>
})
.then(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">data</span>)</span>{
    <span class="hljs-built_in">console</span>.log(data.items);
});
</code></span></pre>


<h2 class="wp-block-heading">JSONPで利用する</h2>



<p>Ajax同様にJSONPでレスポンスを返すことも出来ます。 あまりおすすめできる機能ではないので、初期設定では無効化されています。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">require</span> <span class="hljs-string">"Ghostsheet.php"</span>;

$gs = <span class="hljs-keyword">new</span> Ghostsheet();
$gs-&gt;config(<span class="hljs-keyword">array</span>(
    <span class="hljs-string">"cacheDir"</span> =&gt; <span class="hljs-string">"./gscache"</span>,
    <span class="hljs-string">"jsonp"</span> =&gt; <span class="hljs-keyword">true</span> <span class="hljs-comment">// JSONP機能を有効に</span>
));
$gs-&gt;ajax();
</code></span></pre>


<p>受け取るidのホワイトリストを作ったり、 キャッシュディレクトリを非公開にするなどの対策をして使用した方が良いかな、と思います。</p>



<h2 class="wp-block-heading">その他のオプション・機能など</h2>



<p>ざっくりとしか書いてませんが、APIドキュメントをどうぞ。</p>



<p><a href="https://github.com/mach3/ghostsheet/blob/master/doc/api.md">Ghostsheet : API Doc</a></p>



<h2 class="wp-block-heading">必ず気をつけなければならないこと</h2>



<p>Googleスプレッドシートを簡易的なCMSとして使用する上で、気をつければならないこと。</p>



<h3 class="wp-block-heading">非公開情報は載せない</h3>



<p>「Webで公開」機能を利用しないと使えないライブラリなので、 そのスプレッドシートの内容は全て公開されてしまいます。</p>



<h3 class="wp-block-heading">共有設定に気をつけて</h3>



<p>第三者が編集できるような状態にしない。 クライアントと共有したい場合は、限定公開でユーザーを決め打ちしましょう。</p>



<h3 class="wp-block-heading">「変更が加えられると自動的に再公開する」のチェックはオフに</h3>



<p>編集途中の状態で公開されて恥ずかしい思いをする可能性があります。 自動公開ではなく、編集が終わったら都度「今すぐ再公開」ボタンを押すようにしましょう。</p>



<h2 class="wp-block-heading">まとめ : Googleスプレッドシートの活用について</h2>



<p>私は、優秀なクローンでも出ない限り、テーブルの編集でGoogleスプレッドシートの右に出るサービスは無いと思っています。 そして、WYSIWIGではなくテーブルでの管理をしたいWebコンテンツというのも多くあるでしょう。 例えば、</p>



<ul class="wp-block-list">
<li>お店のメニュー表</li>



<li>製品リスト</li>



<li>詳細画面の要らないニュースリスト</li>



<li>その他リストコンテンツ</li>
</ul>



<p>などなど。このようなデータコレクション的なコンテンツは、 CMSでがんばって実装したりするよりはテーブルで管理出来たほうが メンテナンスの効率も良いと感じるのです。</p>



<p>また、WordPressはわからないけどExcelならいつもつかってるからわかるよ！ というWeb担当者も多くいらっしゃると思います。 （専任の枠を割けずに総務の方が兼任しているようなケースでは特に）</p>



<p>そんなわけで、私はこのお題を執拗に探求しているのであります。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>GoogleスプレッドシートをJSONPで利用する（後編）</title>
		<link>https://blog.mach3.jp/2012/03/09/get-spreadsheet-as-json-02.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Fri, 09 Mar 2012 09:37:51 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[JSONP]]></category>
		<category><![CDATA[Spreadsheet]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2313</guid>

					<description><![CDATA[『GoogleスプレッドシートをJSONPで利用する（前編）』の続きです。 一連の処理をまとめてみたスクリプトを紹介します。 書いてみたもの SpreadSheetLoader mach3/js-spreadsheetl [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>『<a href="/2012/03/get-spreadsheet-as-json.html">GoogleスプレッドシートをJSONPで利用する（前編）</a>』の続きです。<br />
一連の処理をまとめてみたスクリプトを紹介します。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-wdd_L9degVk/T1IymJTfKtI/AAAAAAAABdk/YZrFvGpXApA/s400/201203032357.png" alt="GoogleスプレッドシートをJSONPで利用する（後編）"/></figure>



<p></p>



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



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



<h3 class="wp-block-heading">SpreadSheetLoader</h3>



<p><a href="https://github.com/mach3/js-spreadsheetloader">mach3/js-spreadsheetloader via GitHub</a></p>



<ul class="wp-block-list">
<li>スプレッドシートのJSONを読み込みます</li>



<li>読み込んだデータを整理します</li>



<li>jQuery 1.7+ が必要です</li>
</ul>



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



<h3 class="wp-block-heading">1. URLを取得</h3>



<p>まず<a href="">前編</a>の記事を参考にしてURLを取得してきましょう。<br />
形式は「Atom」または「RSS」の、「セル」を選択してください。<br />
こんな感じの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://spreadsheets.google.com/feeds/cells/**********/***/public/basic
</div></figure>
</blockquote>



<h3 class="wp-block-heading">2. 読み込む</h3>



<p>まずはインスタンスを初期化し、URLを渡し、読み込みます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">// 1. インスタンス初期化</span>
<span class="hljs-keyword">var</span> myloader = <span class="hljs-keyword">new</span> SpreadSheetLoader( &#91;your_url] );

<span class="hljs-comment">// 2. readyイベントハンドラを登録</span>
myloader.on(<span class="hljs-string">"ready"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
    <span class="hljs-keyword">var</span> data = <span class="hljs-keyword">this</span>.getData();
});

<span class="hljs-comment">// 3. load()</span>
myloader.load();
</code></span></pre>


<ol class="wp-block-list">
<li>コンストラクタの引数にURLを渡して初期化します。<br /><br />URLは後から<em>setUrl()</em>で渡すことも出来ます。</li>



<li><em>on()</em>で<em>ready</em>イベントへのハンドラを設定します。<br /><br /><em>ready</em>イベントは、スプレッドシートが読み込まれ、データが整理された時点で発火します。</li>



<li><em>load()</em>で読み込み開始</li>
</ol>



<h3 class="wp-block-heading">3. データを利用する</h3>



<p>readyイベントハンドラの中では、自由にデータを利用する事ができます。<br />
あとは煮るなり焼くなり。<br />
データの利用の仕方は…</p>



<h2 class="wp-block-heading">データを取得する</h2>



<p>整理されたデータを取得して利用する為には、幾つかの方法が用意されています。</p>



<dl>
<dt>getData() : Array</dt>
<dd>データがまるごと配列で返されます。</dd>
</dl>



<pre class="wp-block-preformatted">myloader.on("ready", function(){
    var data = this.getData();
    console.log(data[3]); // 4番目のデータ
});
</pre>



<dl>
<dt>getItem(condition) : Array</dt>
<dd>条件に合うデータのみを配列で返します。<br />
条件はオブジェクトで渡します。</dd>
</dl>



<pre class="wp-block-preformatted">myloader.on("ready", function(){
    var myItems = this.getItem({color:"red", price:800}); // 色がredで、価格が800の物を抽出
});
</pre>



<dl>
<dt>each(callback)</dt>
<dd>データに対して繰り返し処理を行います。（中身はjQuery.fn.eachです）</dd>
</dl>



<pre class="wp-block-preformatted">myloader.on("ready", function(){
    var total = 0;
    this.each(function(){
      total += this.price;
    });
    console.log( "Total price:", total ); // 全データのpriceの合計
});
</pre>



<h2 class="wp-block-heading">試してみる</h2>



<h3 class="wp-block-heading">ソース</h3>



<p>例えば、<a href="https://docs.google.com/spreadsheet/ccc?key=0Ark6jIWYcmkLdEIyTURIVTAwdTM2Z00wUkpfY2hyRlE#gid=0">こんな表</a>を読み込んでみます。</p>



<p><iframe width="500" height="200" frameborder="0" src="https://docs.google.com/spreadsheet/pub?key=0Ark6jIWYcmkLdEIyTURIVTAwdTM2Z00wUkpfY2hyRlE&amp;output=html&amp;widget=true"></iframe></p>



<h3 class="wp-block-heading">デモ</h3>



<p><iframe width="100%" height="300" src="http://jsfiddle.net/rCj9B/1/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe></p>



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



<p>前記事の通り、使える場面というのはわりと限られてそうではありますが、<br />
何かの折に使ってみようかなと思っております。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>GoogleスプレッドシートをJSONPで利用する（前編）</title>
		<link>https://blog.mach3.jp/2012/03/07/get-spreadsheet-as-json.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Wed, 07 Mar 2012 09:52:12 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[Spreadsheet]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2286</guid>

					<description><![CDATA[以前Yahoo! pipesで似たような事をやりましたが、 どうやらGoogleスプレッドシートそのものがJSON出力に対応していたので、 それをJSから利用してみようという試みです。 URLの取得 現在の「新しいスプレ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>以前<a href="/2011/02/cms-with-yahoopipes.html">Yahoo! pipesで似たような事をやりました</a>が、<br />
どうやらGoogleスプレッドシートそのものがJSON出力に対応していたので、<br />
それをJSから利用してみようという試みです。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-wdd_L9degVk/T1IymJTfKtI/AAAAAAAABdk/YZrFvGpXApA/s400/201203032357.png" alt="GoogleスプレッドシートをJSONPで利用する（前編）"/></figure>



<p></p>



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



<ol class="wp-block-list">
<li>URLの取得</li>



<li>「リスト」と「セル」</li>



<li>JSONPしてみる</li>



<li>どんな時に使えそうか</li>



<li>デメリットなど</li>



<li>後半へ</li>
</ol>



<h2 class="wp-block-heading">URLの取得</h2>



<p class="caution">
現在の「新しいスプレッドシート」では「公開データのリンクを取得」のUIがありませんが、APIは一応整備されていてJSONPでも利用できます。<br />
URL: <strong>https://spreadsheets.google.com/feeds/list/[A]/[B]/public/basic?alt=json</strong><br />
[A]にはスプレッドシートID、[B]にはワークシートIDが入ります。
</p>



<p>まずは対象となるスプレッドシートをJSONで出力する事からスタート。<br />
現時点でJSONは選択肢には出てこないので、ちょっと自分で書き換える必要があります。</p>



<ol class="wp-block-list">
<li>「ファイル」→「ウェブに一般公開」→「公開開始」で公開する。</li>



<li>「公開データへのリンクを取得 」で「RSS」を選択する。</li>



<li>末尾の「alt=rss」を「alt=<em>json</em>」に変更してコピー。</li>
</ol>



<p>コピーしたらアドレスバーに入力して内容をチェックしてみましょう。</p>



<h2 class="wp-block-heading">「リスト」と「セル」</h2>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-eJTAufGfAmM/T1IymLL0dLI/AAAAAAAABdk/KCozZR85UCA/s500/201203040001.png" alt="「リスト」と「セル」"/></figure>



<p></p>



<p>「公開データへのリンクを取得」では、<em>「リスト」</em>と<em>「セル」</em>というラジオボタンがありますが、<br />
これはデータ出力の方法を設定する物です。</p>



<dl>
<dt>「リスト」</dt>
<dd>データの1カラム目をタイトルとし、行を一つのコンテンツとして出力。</dd>
<dt>「セル」</dt>
<dd>内容を含むセルを全て順番に出力していきます。</dd>
</dl>



<h3 class="wp-block-heading">例</h3>



<p>例えば、次のようなテーブルの場合。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>id</th><th>name</th><th>content</th></tr></thead><tbody><tr><td>1</td><td>hoge</td><td>this is hoge</td></tr></tbody></table></figure>



<p>「リスト」の場合は次のように出力されます。<br />
行ごとに「entry」がある感じですね。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">{
    <span class="hljs-string">"version"</span>: <span class="hljs-string">"1.0"</span>,
    <span class="hljs-string">"encoding"</span>: <span class="hljs-string">"UTF-8"</span>,
    ...
    <span class="hljs-string">"feed"</span>: {
        ...
        <span class="hljs-string">"entry"</span>: &#91;{
            ...
            <span class="hljs-string">"title"</span>: {
                <span class="hljs-string">"type"</span>: <span class="hljs-string">"text"</span>,
                <span class="hljs-string">"$t"</span>: <span class="hljs-string">"1"</span>
            },
            <span class="hljs-string">"content"</span>: {
                <span class="hljs-string">"type"</span>: <span class="hljs-string">"text"</span>,
                <span class="hljs-string">"$t"</span>: <span class="hljs-string">"name: hoge, content: this is hoge"</span>
            }
        }]
    }
}
</code></span></pre>


<p>一方「セル」の場合は、内容を含むセル毎にentryを出力します。<br />
現在地はtitleの「A1」「B1」「A2」などで取得できる他、<br />
id属性にあるURLの末尾にRC方式で記載されています。</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://spreadsheets.google.com/feeds/cells/[document_id]/od6/public/basic/R1C3
</div></figure>
</blockquote>


<pre class="wp-block-code"><span><code class="hljs language-javascript">{
    <span class="hljs-string">"version"</span>: <span class="hljs-string">"1.0"</span>,
    <span class="hljs-string">"encoding"</span>: <span class="hljs-string">"UTF-8"</span>,
    ...
    <span class="hljs-string">"feed"</span>: {
        <span class="hljs-string">"entry"</span>: &#91;
            {
                ...
                <span class="hljs-string">"title"</span>: {
                        <span class="hljs-string">"type"</span>: <span class="hljs-string">"text"</span>,
                        <span class="hljs-string">"$t"</span>: <span class="hljs-string">"A1"</span>
                },
                <span class="hljs-string">"content"</span>: {
                        <span class="hljs-string">"type"</span>: <span class="hljs-string">"text"</span>,
                        <span class="hljs-string">"$t"</span>: <span class="hljs-string">"id"</span>
                }
            },
            {
                ...
                <span class="hljs-string">"title"</span>: {
                        <span class="hljs-string">"type"</span>: <span class="hljs-string">"text"</span>,
                        <span class="hljs-string">"$t"</span>: <span class="hljs-string">"B1"</span>
                },
                <span class="hljs-string">"content"</span>: {
                        <span class="hljs-string">"type"</span>: <span class="hljs-string">"text"</span>,
                        <span class="hljs-string">"$t"</span>: <span class="hljs-string">"name"</span>
                }
            },
            <span class="hljs-comment">/* セルの分繰り返し */</span>
        ]
    }
}
</code></span></pre>


<h3 class="wp-block-heading">どっちがいいの？</h3>



<p>一見すると「リスト」の方が扱いやすそうなのですが、<br />
「リスト」は区切り文字に使用される「,」および「:」がセルの内容に含まれていても、<br />
エスケープ等はしてくれないのでパースが少々厄介になります。</p>



<p>つまり、セル内容に区切り文字を含む可能性がある場合は<br />
「セル」方式を整理して利用した方が安全そうです。</p>



<h2 class="wp-block-heading">JSONPしてみる</h2>



<p>jQueryを使ってJSONPで取得してみます。<br />
コールバック用のパラメータは「callback」なのでデフォルトでOK。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> url = <span class="hljs-string">"&#91;your_url]"</span>;

$.ajax({
    <span class="hljs-attr">url</span> : url,
    <span class="hljs-attr">dataType</span> : <span class="hljs-string">"jsonp"</span>,
    <span class="hljs-attr">success</span> : <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">data, status</span>)</span>{
        $.each(data.feed.entry, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">i, item</span>)</span>{
            <span class="hljs-built_in">console</span>.log(item);
        });
    }
});
</code></span></pre>


<p>渡されたオブジェクトをdataとして、data.feed.entryと辿ると各アイテムが取得できます。</p>



<h2 class="wp-block-heading">どんな時につかえそうか</h2>



<p>CMSは数あれど、ニュース記事や静的なページは編集出来ても、<br />
表形式の内容の編集には基本的には向いていません。<br />
また、「MTやWordPressはわからないけどExcelなら使えるよ！」<br />
という方も、一般企業のWeb担当さんにはいらっしゃるかもしれません。</p>



<p>例えば、</p>



<ul class="wp-block-list">
<li>お店のメニュー</li>



<li>ショップリスト</li>



<li>スライダーの画像リスト</li>
</ul>



<p>といったコンテンツをクライアントが更新担当する場合は導入検討の余地がありそうですね。<br />
表形式は、ページというより簡易データベースとして活躍しそうです。</p>



<p>私は先日、JavaScriptから商品リストを読み込みたい案件があり、<br />
定期的にメンテナンスもある関係上管理しやすくする為、導入してみました。</p>



<h2 class="wp-block-heading">デメリットなど</h2>



<h3 class="wp-block-heading">アクセシビリティの問題</h3>



<p>JavaScriptでの出力となると、当然アクセシビリティの問題が生じます。<br />
そこらへんが気になる性格のコンテンツにはあまり適切な手法ではないと思います。<br />
それでも導入したい場合はクライアント側のJavaScriptではなくサーバサイドでの処理、<br />
且つキャッシュの保持等を検討した方が良いかもしれません。</p>



<h3 class="wp-block-heading">オーナー情報に注意</h3>



<p>出力結果を見るとわかりますが、gmailのアカウント名が思いっきり出力されます。<br />
気になる場合は専用のアカウントを使うか、<br />
開発が終わったら担当者のアカウントに移譲した方が良いでしょう。</p>



<h2 class="wp-block-heading">後半へ</h2>



<p>後半は、これを単純化するライブラリを書いてみたので、そのご紹介です。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
