June 13, 2024
Table of Contents
英単語の情報が書いてあるスプレッドシートの値を取得して、ボタンクリック時にランダムで表示
export const SheetsApi: React.FC = () => {
const [sheetData, setSheetData] = useState<SheetDataType | null>(null);
const [columnHeader, setColumnHeader] = useState<string[]>([]);
const [randomIndex, setRandomIndex] = useState<number>(0);
const ROW_LENGTH = 4;
const fetchWords = async (): Promise<SheetDataType> => {
const sheetsId = process.env.REACT_APP_SHEETS_ID;
const apiKey = process.env.REACT_APP_SHEETS_API_KEY;
try {
const response = await fetch(`https://sheets.googleapis.com/v4/spreadsheets/${sheetsId}/values/A:F/?key=${apiKey}`);
if (!response.ok) {
throw new Error('Failed to fetch data');
}
const data = await response.json();
return data;
} catch (error) {
console.error(error);
throw error;
}
};
useEffect(() => {
fetchWords().then((value) => {
const header = value.values.shift();
if (header) {
setColumnHeader(header);
}
setSheetData(value);
});
}, []);
const handleNextClick = () => {
if (sheetData && sheetData.values.length > 0) {
const index = Math.floor(Math.random() * sheetData.values.length);
setRandomIndex(index);
}
};
return (
<div>
<Header />
<h2>Sheets Api</h2>
<p>ランダムに英単語を表示</p>
{sheetData && sheetData.values && (
<div>
<button
onClick={handleNextClick}
>NEXT!</button>
<Container className='mt-5'>
<Stack gap={3}>
{Array.from({ length: ROW_LENGTH }).map((_, index) => (
<Row key={index}>
<Col className='col-3'>{columnHeader[index]}</Col>
<Col>{sheetData.values[randomIndex][index]}</Col>
</Row>
))}
</Stack>
</Container>
</div>
)}
</div>
);
}
const response = await fetch(`https://sheets.googleapis.com/v4/spreadsheets/${sheetsId}/values/${sheetName}!${range}/?key=${apiKey}`);