4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SpreadSheetを簡易データベースのように使う最も簡単な方法

Last updated at Posted at 2019-12-05

この記事は StudioZ Tech Advent Calendar 2019 の6日目の記事です。

先日、ちょっとしたWebサイトの開発において不定期で企画側で表示上の数値を変更したいという要望がありました。
そんなとき、SpreadSheetなら誰でも扱えるし、スマートフォン上からでも操作できるし、DBマスタのように使う事ができればエンジニアの手を使わずに好きなタイミングで更新できるよね、ということで調べ、対応した内容を手順を追って記述します。

新しいSpreadSheetを作る

特になにも考えず、新しいシートを作りましょう。
https://docs.google.com/spreadsheets/create

DBのごとく必要な情報をまとめる

以下の画像は記事のマスタを扱うような感じで捉えてもらえればいいです。
スクリーンショット 2019-12-02 17.28.15.png

id、title、detailはそのままキー名の通り、delete_flgは削除フラグとして。
開発環境と本番環境があるとして、open_flgが立っていたら本番で公開等、考えていただければいいでしょう。

さて、早くも公開です

早くも作成したSpreadSheetを公開します。

スクリーンショット 2019-12-02 17.29.54.png
スクリーンショット 2019-12-02 17.30.09.png

画像のとおり、[ファイル]→[ウェブに公開]→[公開]で公開できます。

さて、ここで疑問に思った人も多いでしょう。
そんなことしたらこのファイルは誰でも閲覧できるようになってしまうのでは?
お察しの通り、この方法では編集はできないまでにしても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

以下のような感じで取得できると思います。
スクリーンショット 2019-12-02 18.03.16.png

これでSpreadSheet側の準備は整いました。
このJsonをサーバ側で取得し、整形して表示します。

サーバ側でJsonを取得・整形する

今回はサンプルとしてphpで記述します。
必要な情報だけを引っこ抜きます。

getSpreadSheetData
/**
 * 対象のスプレッドシートデータを取得
 * @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を使用しましょう。

4
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?