この記事は StudioZ Tech Advent Calendar 2019 の6日目の記事です。
先日、ちょっとしたWebサイトの開発において不定期で企画側で表示上の数値を変更したいという要望がありました。
そんなとき、SpreadSheetなら誰でも扱えるし、スマートフォン上からでも操作できるし、DBマスタのように使う事ができればエンジニアの手を使わずに好きなタイミングで更新できるよね、ということで調べ、対応した内容を手順を追って記述します。
新しいSpreadSheetを作る
特になにも考えず、新しいシートを作りましょう。
https://docs.google.com/spreadsheets/create
DBのごとく必要な情報をまとめる
以下の画像は記事のマスタを扱うような感じで捉えてもらえればいいです。
id、title、detailはそのままキー名の通り、delete_flgは削除フラグとして。
開発環境と本番環境があるとして、open_flgが立っていたら本番で公開等、考えていただければいいでしょう。
さて、早くも公開です
早くも作成したSpreadSheetを公開します。
画像のとおり、[ファイル]→[ウェブに公開]→[公開]で公開できます。
さて、ここで疑問に思った人も多いでしょう。
そんなことしたらこのファイルは誰でも閲覧できるようになってしまうのでは?
お察しの通り、この方法では編集はできないまでにしてもpre_flgが立っていてもdelete_flgが立っていても、この公開urlの存在を知ってしまった人は全員アクセスできてしまうのです。
このため、秘匿したい情報を含む場合はこの方法を使用することをおすすめしません。
(全体公開しない方法は「最も簡単な方法」ではなくなるのでまたの機会に・・・)
公開したSpreadSheetをJson化する
サーバ側で扱うために取得はJsonで行います。
なんら難しいことはありません。
例えば、SpreadSheetのurlが以下だとします。
https://docs.google.com/spreadsheets/d/1n6_Ix7VHcswzjcWN3tRE8h3qF-uCQ9ywojAtZXrl8g0/edit#gid=0
コレに対して、jsonで取得する場合は、以下のようになります
https://spreadsheets.google.com/feeds/list/1n6_Ix7VHcswzjcWN3tRE8h3qF-uCQ9ywojAtZXrl8g0/od6/public/values?alt=json
見ての通り、今回使用したSpreadSheetのシートIDは元のurlより
「1n6_Ix7VHcswzjcWN3tRE8h3qF-uCQ9ywojAtZXrl8g0」であることがわかります。
jsonで取得する場合は、このIDを以下に当てはめてあげるだけです。
https://spreadsheets.google.com/feeds/list/{シートID}/od6/public/values?alt=json
これでSpreadSheet側の準備は整いました。
このJsonをサーバ側で取得し、整形して表示します。
サーバ側でJsonを取得・整形する
今回はサンプルとしてphpで記述します。
必要な情報だけを引っこ抜きます。
/**
* 対象のスプレッドシートデータを取得
* @return array
*/
public function getSpreadSheetData($sheetId){
$data = "https://spreadsheets.google.com/feeds/list/{$sheetId}/od6/public/values?alt=json";
$json = file_get_contents($data);
$json_decode = json_decode($json, true);
$list = $json_decode["feed"]["entry"];
foreach ($list as $key => $item) {
foreach ($item as $id => $value) {
if (!preg_match("/^gsx/", $id)) {
unset($list[$key][$id]);
continue;
}
$list[$key][str_replace('gsx$', '', $id)] = $value['$t'];
unset($list[$key][$id]);
}
}
return $list;
}
以上で終了です。
とても簡単ですよね!
ただ、この方法は前述した「urlを知っている人は誰でも閲覧できてしまう」点以外にも、
アカウント(SpreadSheetの所持側)あたり100秒間に100リクエストの制限が存在するという弱点も存在します。
アクセスが多いサイトではそのまま使用しないほうがいいでしょう。
もちろん、キャッシュ等を使用してアクセス回数が100秒/100リクエストを超えないように操作すれば問題ないと思います!
もし、他人から閲覧されたくない場合やもう少し込み入ったことをしたい場合は、SheetsAPIを使用しましょう。