Node.jsでGoogleスプレッドシートを手軽に読み取る

## はじめに
Node.jsでGoogleスプレッドシートを読み書きするためには、公式のnpmとして[googleapis](https://www.npmjs.com/package/googleapis)が提供されており非常に便利ですが、より少ないコード量で手軽に様々な機能を扱うためのラッパーである[google-api-tool-box](https://www.npmjs.com/package/@genta-mz/google-api-tool-box)を公開したので、使い方を解説します。

## インストール

Node.jsのプロジェクトを作成し、`@genta-mz/google-api-tool-box` をインストールしてください。
```shell
$ npm i @genta-mz/google-api-tool-box
```
https://www.npmjs.com/package/@genta-mz/google-api-tool-box

 ## GoogleAPIでアクセスするための認証情報をセットアップする

 一番簡単なのはGCPプロジェクトのサービスアカウントを利用する方法です。
 サービスアカウントの作成については[こちら](https://qiita.com/genta-mz/items/eeb5f3037e55486d9949)を参考にしてください。

 ## スプレッドシートの値を取得する

 ### 初期化

 初期化コードはこれだけです。
 ```ts
const toolBox = new GoogleAPIToolBox({
  auth: {
    serviceAccountKeyFile: 'ダウンロードしたサービスアカウントのkeyJsonへのパス'
  }
}); 
 ```
 `spreadsheet` を経由してスプレッドシートを読み書きするためのAPIにアクセスできます。
 以下はスプレッドシートの値を二次元配列の形式で取得するコードです。
 ```ts
const spreadsheetId = 'スプレッドシートのID';
const range = 'スプレッドシートのシート名、もしくはrange';

// 指定したシートからデータを取得する
const ranges = await toolBox.spreadSheet.getSheetValues({
  spreadsheetId: spreadsheetId,
  range: range,
});

// レスポンスから指定したシートの内容を取り出す
const values = ranges.get(range);
if (!values) {
  throw new Error('指定したシートやrangeが見つからなかった。');
}

// 二次元配列のレスポンスをカンマ区切りで表示する
for (const row of values) {
  console.log(row.join(','));
}
 ```
 このように、かなり少ないコードでスプレッドシートのデータを取得することができます。　

 ## サンプルを動作させてみる

 [公開しているサンプルコード](https://github.com/genta-mz/google-api-tool-box/blob/main/sample/spreadsheet/get-sheet-values.ts)を動作させてみましょう。
サンプルは[yargs](https://www.npmjs.com/package/yargs)を使用したCLIツールとして実装しています。

### 手元でサンプルを動かすために

[genta-mz/google-api-tool-box](https://github.com/genta-mz/google-api-tool-box/tree/main)を手元にcloneしてください。
また、実行するためにはnpm(version 10)と、node20のインストールが必要です。
```sh
git clone https://github.com/genta-mz/google-api-tool-box.git
```
google-api-tool-boxリポジトリの直下でnpmをインストールします。
```
cd google-api-tool-box
npm i
```

### 実行する

 まずはアクセスしたいスプレッドシートに対してサービスアカウントへ権限を付与します。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61849/a5f67d0a-b45a-a880-e509-19dcb9fcea71.png">

この「sample-sheet-get-values」シートの内容を読み取ってみます。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61849/d9f7238d-9c3c-3f88-3b00-5cda8e1ac5f9.png">

改めてサンプルコードを掲載します。

```ts sample/spreadsheet/get-sheet-values.ts
import { GoogleAPIToolBox } from '@genta-mz/google-api-tool-box';
import yargs from 'yargs';

(async () => {
  const argv = await yargs
    .option('keyFile', {
      type: 'string',
      alias: 'k',
      description: 'Path to service account key file',
      demandOption: true,
    })
    .option('spreadsheetId', {
      type: 'string',
      alias: 's',
      description: 'Spreadsheet id',
      demandOption: true,
    })
    .option('sheetName', {
      type: 'string',
      alias: 'n',
      description: 'Sheet name or range specification',
      demandOption: true,
    })
    .help().argv;

  const toolBox = new GoogleAPIToolBox({ auth: { serviceAccountKeyFile: argv.keyFile } });

  const ranges = await toolBox.spreadSheet.getSheetValues({
    spreadsheetId: argv.spreadsheetId,
    range: argv.sheetName,
  });

  const values = ranges.get(argv.sheetName);
  if (!values) {
    throw new Error('Sheet name or range not found.');
  }

  for (const row of values) {
    console.log(row.join(','));
  }
})();
```

こちらを実際にCLIから実行します。
```sh
npx ts-node sample/spreadsheet/get-sheet-values.ts -k 'ダウンロードしたサービスアカウントのkeyJsonへのパス' -s 'スプレッドシートのID' -n 'sample-sheet-get-values'
```

結果は以下のようになります。
```sh
version,id,name
0.0.1,0,genta
0.0.1,1,mizumoto
0.0.1,2,hoge
```
シートに記載されている値を取得することができていますね。

## おわり

基本的な使い方は以上となります。
google-api-too-boxでは他にもスタイル情報(セルの色や大きさ)を含んだシートの内容の取得、シートの内容の更新など様々な機能を提供しています。
また、それらの機能は一括でシートを取得するなど、パフォーマンス上の配慮が必要な少し高度な操作にも対応しています。

どのような機能があるかの詳細については[他のサンプルコード](https://github.com/genta-mz/google-api-tool-box/tree/main/sample)を参照してみてください。

他の機能の詳細については、また記事にして解説できればと思っています。
気になることや、不具合、間違いなどがあればお気軽にコメント、ご連絡いただければと思います。