簡便にReactのアプリを作ってみようということで、Google SpreadSheetのデータを読み込ませてみました。
サンプルデータ
ID,Name
1,aaa
2,bbb
3,aaa
4,bbb
5,aaa
6,bbb
7,aaa
8,bbb
こんな感じのCSVファイルをGoogle SpreadSheetにアップロードしておきます。
シート名は"sheet1"とかにしておきます。
そして、共有で「リンクを知っている全員に変更」にして、
Google SpreadSheetのデータをJSONで取得する
Google SpreadSheetのデータを取得するには、APIキーが必要になります。
Google Cloud PlatformからAPIキーを取得し、メモしておきます。
また、先ほどアップロードしたサンプルデータのURLの
https://docs.google.com/spreadsheets/d/xxxxxxxxxxxxx/edit?usp=sharing
xxxxxxxxxxxxx部分がスプレッドシートIDになるので、こちらもメモしておきます。
Google SpreadSheetのデータをJSONで取得するには
https://sheets.googleapis.com/v4/spreadsheets/スプレッドシートID/values/シート名?key=APIキ
をブラウザで開くと、
{
"range": "sheet1!A1:Z1001",
"majorDimension": "ROWS",
"values": [
[
"ID",
"Name"
],
[
"1",
"aaa"
],
[
"2",
"bbb"
],
[
"3",
"aaa"
],
[
"4",
"bbb"
],
[
"5",
"aaa"
],
[
"6",
"bbb"
],
[
"7",
"aaa"
],
[
"8",
"bbb"
]
]
}
のようなJSONが表示されます。
APIキー発行等の詳しい手順は下記サイトを参照してください。
ReactでJSONを呼び出す
Reactの環境構築等については省略。
npx create-react-app my-app
cd my-app
で、Reactのプロジェクトを作成し、プロジェクトフォルダに移動。
VSCodeがインストールされていれば
code .
でプロジェクトディレクトリを開いて、.envファイルを作成
(コーテーションやコンマは入れない)
REACT_APP_GOOGLE_SHEETS_API_KEY=APIキー
REACT_APP_GOOGLE_SHEETS_DOC_ID=スプレッドシートID
データをコンソールログに表示してみる。
const [datas, setDatas] = useState([])
function App() {
	const [datas, setDatas] = useState([])
	useEffect(() => {
		 fetch(`https://sheets.googleapis.com/v4/spreadsheets/${process.env.REACT_APP_GOOGLE_SHEETS_DOC_ID}/values/sheet1?key=${process.env.REACT_APP_GOOGLE_SHEETS_API_KEY}`)
			.then(res => res.json())
			.then(datas =>
				setDatas(datas.values))
	}, [])
	console.log(datas);
  return (
    <div>
    </div>
  );
}
export default App;
二重配列で出力される。
[
    [
        "ID",
        "Name"
    ],
    [
        "1",
        "aaa"
    ],
    [
        "2",
        "bbb"
    ],
    [
        "3",
        "aaa"
    ],
    [
        "4",
        "bbb"
    ],
    [
        "5",
        "aaa"
    ],
    [
        "6",
        "bbb"
    ],
    [
        "7",
        "aaa"
    ],
    [
        "8",
        "bbb"
    ]
]
このままでは使いづらいので、以下のサイトを参考にして辞書型データに変換。
const [datas, setDatas] = useState([])
function App() {
	const [datas, setDatas] = useState([])
    const CsvDic = (props) => {
      const [header, ...rows] = props;
      return rows.map((row) =>
        row.reduce((acc, cell, i) => ({ ...acc, [header[i]]: cell }), {})
      );
    }
	useEffect(() => {
		 fetch(`https://sheets.googleapis.com/v4/spreadsheets/${process.env.REACT_APP_GOOGLE_SHEETS_DOC_ID}/values/sheet1?key=${process.env.REACT_APP_GOOGLE_SHEETS_API_KEY}`)
			.then(res => res.json())
			.then(datas =>
				setDatas(CsvDic(res.data.values))
	}, [])
	console.log(datas);
  return (
    <div>
    </div>
  );
}
export default App;
コンソールログの表示
[
    {
        "ID": "1",
        "Name": "aaa"
    },
    {
        "ID": "2",
        "Name": "bbb"
    },
    {
        "ID": "3",
        "Name": "aaa"
    },
    {
        "ID": "4",
        "Name": "bbb"
    },
    {
        "ID": "5",
        "Name": "aaa"
    },
    {
        "ID": "6",
        "Name": "bbb"
    },
    {
        "ID": "7",
        "Name": "aaa"
    },
    {
        "ID": "8",
        "Name": "bbb"
    }
]