Loading...

2025-07-02(水) 15:00

🔑 Node.js でGoogleスプレッドシートを操作する

GoogleスプレッドシートNode.js
Node.js で Google スプレッドシートを操作する方法を解説します。

目次

前提と注意事項

  • Node.js はインストール済みであることを前提とします。
  • 記事執筆時点で使用している Node.js のバージョンは 20.6.0 です。
  • .env ファイルを用いた環境変数の読み込みを行います。

この記事のゴール

Node.js により Google スプレッドシートへアクセスし、以下の基本操作を行う方法を解説します。

  • データの取得
  • データの追加
  • データの更新
  • データの削除

Google Sheets API を有効化する

Google Cloud Console にアクセスし、「API とサービス」ページにて「sheets api」を検索します。表示された「Google Sheets API」をクリックし、「有効にする」を選択します。

Google Cloud Consoleでsheets apiを有効化

その後、左側メニューから「認証情報」をクリックし、「認証情報を作成」>「サービスアカウント」を選択します。

Google Cloud Consoleでサービスアカウントを作成

以下のように、サービスアカウントの詳細を設定するページが表示されるので、適当な名前や説明入力して「完了」ボタンをクリックします。

Google Cloud Consoleでサービスアカウントの詳細ページへ移動

以下のようにサービスアカウントが作成されるので、クリックして詳細ページへ移動します。

Google Cloud Consoleで認証情報のリストページへ移動

作成後は「鍵」タブを選択し、「新しい鍵を作成」>「JSON」を選択してダウンロードします。

Google Cloud Consoleで新しい鍵を作成

以下のようにダイアログ表示されるので、JSON 選択してダウンロードします。

Google Cloud ConsoleでJSONを保存

ダウンロードされた JSON ファイル(例:cosmic-facility-454403-g7-*.json)は認証で使用します。 保存した JSON の中身は以下のような内容になっています。

cosmic-facility-454403-g7-*.json
{
  "type": "service_account",
  "project_id": "cosmic-facility-454403-g7",
  "private_key_id": "a11234567890ce28sj80s8ja08se0t8er0whjqw0",
  "private_key": "-----BEGIN PRIVATE KEY-----
  =\n-----END PRIVATE KEY-----\n",
  "client_email": "sheets-api-service-account@cosmic-facility-454403-g7.iam.gserviceaccount.com",
  "client_id": "123456789012345678901",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/sheets-api-service-account%40cosmic-facility-454403-g7.iam.gserviceaccount.com",
  "universe_domain": "googleapis.com"
}

操作対象スプレッドシートの共有設定

対象スプレッドシートを開き、以下のように、「共有」をクリックします。

スプレッドシートをサービスアカウントと共有

「共有」で、保存した JSON ファイルに含まれる client_email の値(ここでは sheets-api-service-account@cosmic-facility-454403-g7.iam.gserviceaccount.com)を入力して編集権限を付与します。

Google Cloud Consoleでサービスアカウントのメールアドレスを追加

以上で、操作対象のスプレッドシートを作成したサービスアカウントを使って操作できるようになりました。

必要なパッケージのインストール

適当なディレクトリを作成して、そこで以下のパッケージをインストールします。

ターミナル
$ mkdir google-sheets-api-with-node-js
$ cd google-sheets-api-with-node-js
$ pnpm add google-spreadsheet google-auth-library dotenv
$ pnpm add @types/node -D

@types/node は、Node.js の型定義を提供するパッケージです。

dotenv は、環境変数を読み込むためのパッケージです。Node.js のバージョンが 16 以上の場合はデフォルトでインストールされているため、そちらを使用する場合はインストール不要です。

以上で、必要なパッケージのインストールが完了です。

.env ファイルの例

.envには以下の内容を記載しておきます。

.env
# スプレッドシートのURLに含まれる文字列
SHEET_ID='1283ahfsd7asg9h23hgase9gasetge'

# サービスアカウントのメールアドレス
GOOGLE_SERVICE_ACCOUNT_EMAIL='sheets-api-service-account@cosmic-facility-454403-g7.iam.gserviceaccount.com'

# サービスアカウントのJSONファイルに含まれる`"private_key"`の値
GOOGLE_PRIVATE_KEY='-----BEGIN PRIVATE KEY-----\n...=\n-----END PRIVATE KEY-----\n'

上記のスプレッドシートのシート ID は、以下のようにスプレッドシートを開いている時の URL のうち、

https://docs.google.com/spreadsheets/d/seid823458h0dfs8a0g34ntwopwgrsagsc/edit?gid=0#gid=0

seid823458h0dfs8a0g34ntwopwgrsagsc の部分がシート ID です。

以上で、.envファイルの設定が完了です。次に実際に Node.js を使ってスプレッドシートを操作します。

スプレッドシートのデータを取得する

read_rows.ts
import { GoogleSpreadsheet } from 'google-spreadsheet';
import { JWT } from 'google-auth-library';
import 'dotenv/config';
 
async function getRowFromSheet() {
  // サービスアカウント認証
  const serviceAccountAuth = new JWT({
    email: process.env.GOOGLE_SERVICE_ACCOUNT_EMAIL || '',
    key: (process.env.GOOGLE_PRIVATE_KEY || '').replace(/\\n/g, '\n'),
    scopes: ['https://www.googleapis.com/auth/spreadsheets'],
  });
 
  const doc = new GoogleSpreadsheet(
    process.env.SHEET_ID || '',
    serviceAccountAuth,
  );
 
  // スプレッドシートの読み込み
  await doc.loadInfo();
 
  // スプレッドシートのタイトルを表示
  console.log(doc.title);
 
  // 最初のシートを取得
  const sheet = doc.sheetsByIndex[0];
 
  // シートのヘッダー行を読み込む
  await sheet.loadHeaderRow();
 
  // シートの列名を確認
  console.log('ヘッダー:', sheet.headerValues);
 
  const rows = await sheet.getRows();
 
  // スプレッドシートの値を2次元配列として取得
  const rowsArray = rows.map((row) => {
    // 各行の値を配列として取得
    return sheet.headerValues.map((header) => row.get(header));
  });
 
  console.log(rowsArray);
}
 
// 実行
(async () => {
  try {
    await getRowFromSheet();
  } catch (error) {
    console.error('Failed to get row from sheet:', error);
  }
})();

上記を以下で実行してみます。

ターミナル
$ npx ts-node read_rows.ts

以下のような結果が表示されます。

ターミナル
$ npx ts-node read_rows.ts
nodejs_test
ヘッダー: [ 'ID', 'name', 'birthday', 'note' ]
[
  GoogleSpreadsheetRow {
    _worksheet: GoogleSpreadsheetWorksheet {
      _spreadsheet: [GoogleSpreadsheet],
      _headerRowIndex: 1,
      _rawProperties: [Object],
      _cells: [],
      _rowMetadata: [],
      _columnMetadata: [],
      _rowCache: [Array],
      _headerValues: [Array]
    },
    _rowNumber: 2,
    _rawData: [ '1', 'tset user1', '2008/1/1', 'テストユーザーです' ],
    _deleted: false
  },
  GoogleSpreadsheetRow {
    _worksheet: GoogleSpreadsheetWorksheet {
      _spreadsheet: [GoogleSpreadsheet],
      _headerRowIndex: 1,
      _rawProperties: [Object],
      _cells: [],
      _rowMetadata: [],
      _columnMetadata: [],
      _rowCache: [Array],
      _headerValues: [Array]
    },
    _rowNumber: 3,
    _rawData: [ '2', 'test user2', '1999/10/12', '備考です' ],
    _deleted: false
  },
  GoogleSpreadsheetRow {
    _worksheet: GoogleSpreadsheetWorksheet {
      _spreadsheet: [GoogleSpreadsheet],
      _headerRowIndex: 1,
      _rawProperties: [Object],
      _cells: [],
      _rowMetadata: [],
      _columnMetadata: [],
      _rowCache: [Array],
      _headerValues: [Array]
    },
    _rowNumber: 4,
    _rawData: [ '3', 'test user3', '2010/3/23', 'テストです' ],
    _deleted: false
  },
  GoogleSpreadsheetRow {
    _worksheet: GoogleSpreadsheetWorksheet {
      _spreadsheet: [GoogleSpreadsheet],
      _headerRowIndex: 1,
      _rawProperties: [Object],
      _cells: [],
      _rowMetadata: [],
      _columnMetadata: [],
      _rowCache: [Array],
      _headerValues: [Array]
    },
    _rowNumber: 5,
    _rawData: [ '4', 'test user4', '1950/2/21' ],
    _deleted: false
  },
  GoogleSpreadsheetRow {
    _worksheet: GoogleSpreadsheetWorksheet {
      _spreadsheet: [GoogleSpreadsheet],
      _headerRowIndex: 1,
      _rawProperties: [Object],
      _cells: [],
      _rowMetadata: [],
      _columnMetadata: [],
      _rowCache: [Array],
      _headerValues: [Array]
    },
    _rowNumber: 6,
    _rawData: [ '5', 'test user5', '2003/6/7' ],
    _deleted: false
  }
]

上記を見て分かる通り、sheet.getRows()GoogleSpreadsheetRow 形式の配列を返します。ここではスプレッドシートの中のデータだけを取得するために、以下のようにします。

read_rows.ts
// 省略
 
const rows = await sheet.getRows();
 
// スプレッドシートの値を2次元配列として取得
const rowsArray = rows.map((row) => {
  // 各行の値を配列として取得
  return sheet.headerValues.map((header) => row.get(header));
});
 
console.log(rowsArray);
 
// 省略

上記に修正して実行すると、以下のように2次元配列としてスプレッドシートの値を取得できます。

ターミナル
$ npx ts-node read_rows.ts
nodejs_test
ヘッダー: [ 'ID', 'name', 'birthday', 'note' ]
[
  [ '1', 'tset user1', '2008/1/1', 'テストユーザーです' ],
  [ '2', 'test user2', '1999/10/12', '備考です' ],
  [ '3', 'test user3', '2010/3/23', 'テストです' ],
  [ '4', 'test user4', '1950/2/21', undefined ],
  [ '5', 'test user5', '2003/6/7', undefined ]
]

スプレッドシートにデータを追加する

add_row.ts
import { GoogleSpreadsheet } from 'google-spreadsheet';
import { JWT } from 'google-auth-library';
import 'dotenv/config';
 
async function inserstRowToSheet(rowsArray: any[]) {
  // サービスアカウント認証
  const serviceAccountAuth = new JWT({
    email: process.env.GOOGLE_SERVICE_ACCOUNT_EMAIL || '',
    key: (process.env.GOOGLE_PRIVATE_KEY || '').replace(/\\n/g, '\n'),
    scopes: ['https://www.googleapis.com/auth/spreadsheets'],
  });
 
  const doc = new GoogleSpreadsheet(
    process.env.SHEET_ID || '',
    serviceAccountAuth,
  );
 
  // スプレッドシートの読み込み
  await doc.loadInfo();
 
  // 最初のシートを取得
  const sheet = doc.sheetsByIndex[0];
 
  // 新しい行を追加
  const newRow = await sheet.addRow(rowsArray);
 
  console.log('新しい行:', newRow);
}
 
// 実行
(async () => {
  try {
    await inserstRowToSheet([
      '6',
      'tset user6',
      '2020/1/1',
      '新規追加ユーザーです',
    ]);
  } catch (error) {
    console.error('Failed to get row from sheet:', error);
  }
})();

実行結果は以下です。

ターミナル
$ npx ts-node add_row.ts
新しい行: GoogleSpreadsheetRow {
  _worksheet: GoogleSpreadsheetWorksheet {
    _spreadsheet: GoogleSpreadsheet {
      _rawProperties: [Object],
      _spreadsheetUrl: 'https://docs.google.com/spreadsheets/d/1dAMTRwMCkj5bV8zZE8h7sRh19fHNfChq0pUhKGL85sc/edit',
      _deleted: false,
      spreadsheetId: '1dAMTRwMCkj5bV8zZE8h7sRh19fHNfChq0pUhKGL85sc',
      auth: [JWT],
      _rawSheets: [Object],
      sheetsApi: [Function],
      driveApi: [Function]
    },
    _headerRowIndex: 1,
    _rawProperties: {
      sheetId: 0,
      title: 'シート1',
      index: 0,
      sheetType: 'GRID',
      gridProperties: [Object]
    },
    _cells: [],
    _rowMetadata: [],
    _columnMetadata: [],
    _rowCache: [],
    _headerValues: [ 'ID', 'name', 'birthday', 'note' ]
  },
  _rowNumber: 7,
  _rawData: [ '6', 'tset user6', '2020/1/1', '新規追加ユーザーです' ],
  _deleted: false
}

以降に、スプレッドシートのデータを更新するコード、削除するコードを記載します。

スプレッドシートのデータを更新する

update_row.ts
async function updateRow() {
  try {
    await doc.useServiceAccountAuth(require('./service-account.json'));
    await doc.loadInfo();
 
    const sheet = doc.sheetsByIndex[0];
    const rows = await sheet.getRows();
 
    const target = rows.find((row) => row.名前 === '山田太郎');
    if (target) {
      target.年齢 = 29;
      await target.save();
      console.log('行を更新しました');
    } else {
      console.log('該当する行が見つかりませんでした');
    }
  } catch (err) {
    console.error('データ更新エラー:', err);
  }
}
 
updateRow();

スプレッドシートのデータを削除する

delete_row.ts
async function deleteRow() {
  try {
    await doc.useServiceAccountAuth(require('./service-account.json'));
    await doc.loadInfo();
 
    const sheet = doc.sheetsByIndex[0];
    const rows = await sheet.getRows();
 
    const target = rows.find((row) => row.名前 === '山田太郎');
    if (target) {
      await target.delete();
      console.log('行を削除しました');
    } else {
      console.log('該当する行が見つかりませんでした');
    }
  } catch (err) {
    console.error('データ削除エラー:', err);
  }
}
 
deleteRow();

まとめ

Google Sheets API を活用することで、Node.js アプリケーションから Google スプレッドシートを自在に操作できます。業務データの収集や外部システムとの連携など、多様なユースケースに対応可能です。エラーハンドリングを含めた堅牢な実装により、安全で信頼性の高いシステム構築が実現できます。