前提と注意事項
- Node.js はインストール済みであることを前提とします。
- 記事執筆時点で使用している Node.js のバージョンは
20.6.0
です。 .env
ファイルを用いた環境変数の読み込みを行います。
この記事のゴール
Node.js により Google スプレッドシートへアクセスし、以下の基本操作を行う方法を解説します。
- データの取得
- データの追加
- データの更新
- データの削除
Google Sheets API を有効化する
Google Cloud Console にアクセスし、「API とサービス」ページにて「sheets api」を検索します。表示された「Google Sheets API」をクリックし、「有効にする」を選択します。

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

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

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

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

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

ダウンロードされた JSON ファイル(例:cosmic-facility-454403-g7-*.json
)は認証で使用します。
保存した 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
)を入力して編集権限を付与します。

以上で、操作対象のスプレッドシートを作成したサービスアカウントを使って操作できるようになりました。
必要なパッケージのインストール
適当なディレクトリを作成して、そこで以下のパッケージをインストールします。
$ 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
には以下の内容を記載しておきます。
# スプレッドシートの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 を使ってスプレッドシートを操作します。
スプレッドシートのデータを取得する
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
形式の配列を返します。ここではスプレッドシートの中のデータだけを取得するために、以下のようにします。
// 省略
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 ]
]
スプレッドシートにデータを追加する
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
}
以降に、スプレッドシートのデータを更新するコード、削除するコードを記載します。
スプレッドシートのデータを更新する
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();
スプレッドシートのデータを削除する
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 スプレッドシートを自在に操作できます。業務データの収集や外部システムとの連携など、多様なユースケースに対応可能です。エラーハンドリングを含めた堅牢な実装により、安全で信頼性の高いシステム構築が実現できます。