【GAS】Google Sheets API - 認証設定と料金体系を解説
概要
Google Sheets APIを活用するための認証手順と料金体系について詳しく解説します。このAPIを使えば、スプレッドシートの操作を自動化したり、効率的にデータを処理することができます。APIを通じて、スプレッドシート上のデータにアクセスし、読み書きや更新が可能になります。
Google Sheets APIは、個人プロジェクトから企業での利用に至るまで、さまざまなニーズに応えることができる柔軟性を持っています。この記事では、Google Sheets APIの認証設定方法から料金体系まで、必要な情報をすべてカバーします。
認証情報の取得手順
Google Sheets APIを使用するには、まず認証情報を取得して設定する必要があります。以下の手順に沿って設定していきましょう。
credentials.jsonの取得
- Google Cloud Consoleにアクセスし、新しいプロジェクトを作成するか、既存のプロジェクトを選択します。
- 左側のメニューから「APIとサービス」→「ライブラリ」を選択。
- 検索バーで「Google Sheets API」を検索し、APIを有効にします。
- 「認証情報を作成」ボタンをクリックし、以下のように設定を行います:
- 「どのAPIを使用していますか?」→「Google Sheets API」
- 「どこからAPIを呼び出しますか?」→「その他のUI(Windows、CLIツールなど)」
- 「アクセスするデータの種類は?」→「ユーザーデータ」
- OAuthクライアントIDを作成する画面でアプリケーション名などの詳細を入力。
- 認証情報ページに戻り、OAuth 2.0クライアントIDの横にある下向き矢印をクリックし、「JSONをダウンロード」を選択します。
- ダウンロードしたJSONファイルを
credentials.jsonとして保存し、スクリプトと同じディレクトリに配置します。
token.jsonの生成
token.jsonはスクリプトを初めて実行したときに自動生成されます。- スクリプト実行時にブラウザが開き、Googleアカウントでの認証を求められます。
- 認証に成功すると、
token.jsonが自動的に生成され、スクリプトのディレクトリに保存されます。
環境変数の設定
credentials.jsonとtoken.jsonのパスを環境変数として設定することで、より簡単に管理できます。
Unix/Linux/macOSの場合:
export GOOGLE_CREDENTIALS_PATH=/path/to/your/credentials.json
export GOOGLE_TOKEN_PATH=/path/to/your/token.json
Windowsの場合:
set GOOGLE_CREDENTIALS_PATH=C:\path\to\your\credentials.json
set GOOGLE_TOKEN_PATH=C:\path\to\your\token.json
実装例
Pythonでの基本的な使用方法
まず、必要なライブラリをインストールします。
pip install google-api-python-client google-auth-httplib2 google-auth-oauthlib
スプレッドシートのデータを読み取る基本的なコード例です。
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from googleapiclient.discovery import build
import os.path
# スコープの定義
SCOPES = ['https://www.googleapis.com/auth/spreadsheets.readonly']
def get_credentials():
"""認証情報を取得または更新する"""
creds = None
# token.jsonが存在する場合、認証情報を読み込む
if os.path.exists('token.json'):
creds = Credentials.from_authorized_user_file('token.json', SCOPES)
# 有効な認証情報がない場合
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
# トークンを更新
creds.refresh(Request())
else:
# 新規認証フローを実行
flow = InstalledAppFlow.from_client_secrets_file(
'credentials.json', SCOPES)
creds = flow.run_local_server(port=0)
# token.jsonに保存
with open('token.json', 'w') as token:
token.write(creds.to_json())
return creds
def read_spreadsheet(spreadsheet_id, range_name):
"""スプレッドシートからデータを読み取る"""
creds = get_credentials()
service = build('sheets', 'v4', credentials=creds)
# Sheets APIを呼び出し
sheet = service.spreadsheets()
result = sheet.values().get(
spreadsheetId=spreadsheet_id,
range=range_name
).execute()
values = result.get('values', [])
return values
# 使用例
if __name__ == '__main__':
SPREADSHEET_ID = 'your-spreadsheet-id'
RANGE_NAME = 'Sheet1!A1:D10'
data = read_spreadsheet(SPREADSHEET_ID, RANGE_NAME)
for row in data:
print(row)
スプレッドシートへのデータ書き込み
def write_to_spreadsheet(spreadsheet_id, range_name, values):
"""スプレッドシートにデータを書き込む"""
creds = get_credentials()
service = build('sheets', 'v4', credentials=creds)
body = {
'values': values
}
result = service.spreadsheets().values().update(
spreadsheetId=spreadsheet_id,
range=range_name,
valueInputOption='USER_ENTERED', # 数式として解釈
body=body
).execute()
print(f'{result.get("updatedCells")} cells updated.')
return result
# 使用例
data = [
['名前', '年齢', '都市'],
['田中太郎', 30, '東京'],
['山田花子', 25, '大阪'],
]
write_to_spreadsheet(SPREADSHEET_ID, 'Sheet1!A1:C3', data)
バッチリクエストでの効率化
複数の操作をまとめて実行することで、APIコール数を削減できます。
def batch_update(spreadsheet_id, requests):
"""複数の更新をバッチで実行する"""
creds = get_credentials()
service = build('sheets', 'v4', credentials=creds)
body = {
'requests': requests
}
result = service.spreadsheets().batchUpdate(
spreadsheetId=spreadsheet_id,
body=body
).execute()
return result
# 使用例:セルの書式設定とデータ更新をまとめて実行
requests = [
{
# セルの背景色を変更
'repeatCell': {
'range': {
'sheetId': 0,
'startRowIndex': 0,
'endRowIndex': 1,
'startColumnIndex': 0,
'endColumnIndex': 3
},
'cell': {
'userEnteredFormat': {
'backgroundColor': {
'red': 0.2,
'green': 0.6,
'blue': 0.9
}
}
},
'fields': 'userEnteredFormat.backgroundColor'
}
}
]
batch_update(SPREADSHEET_ID, requests)
Node.jsでの実装例
const { google } = require('googleapis');
const fs = require('fs');
const readline = require('readline');
const SCOPES = ['https://www.googleapis.com/auth/spreadsheets'];
const TOKEN_PATH = 'token.json';
/**
* 認証情報を取得してコールバックを実行
*/
async function authorize() {
const credentials = JSON.parse(fs.readFileSync('credentials.json'));
const { client_secret, client_id, redirect_uris } = credentials.installed;
const oAuth2Client = new google.auth.OAuth2(
client_id, client_secret, redirect_uris[0]
);
// トークンが存在する場合は読み込む
if (fs.existsSync(TOKEN_PATH)) {
const token = JSON.parse(fs.readFileSync(TOKEN_PATH));
oAuth2Client.setCredentials(token);
return oAuth2Client;
}
// 新規認証が必要
return getNewToken(oAuth2Client);
}
/**
* スプレッドシートのデータを取得
*/
async function readSpreadsheet(spreadsheetId, range) {
const auth = await authorize();
const sheets = google.sheets({ version: 'v4', auth });
const response = await sheets.spreadsheets.values.get({
spreadsheetId,
range,
});
return response.data.values;
}
/**
* スプレッドシートにデータを書き込む
*/
async function writeSpreadsheet(spreadsheetId, range, values) {
const auth = await authorize();
const sheets = google.sheets({ version: 'v4', auth });
const response = await sheets.spreadsheets.values.update({
spreadsheetId,
range,
valueInputOption: 'USER_ENTERED',
resource: { values },
});
return response.data;
}
// 使用例
(async () => {
const SPREADSHEET_ID = 'your-spreadsheet-id';
// データの読み取り
const data = await readSpreadsheet(SPREADSHEET_ID, 'Sheet1!A1:D10');
console.log(data);
// データの書き込み
const newData = [['新しいデータ', 100, '=A1*2']];
await writeSpreadsheet(SPREADSHEET_ID, 'Sheet1!A11:C11', newData);
})();
Google Sheets APIの料金体系
Google Sheets APIの料金体系を理解しておくことで、予期せぬコストを防ぐことができます。
無料枠
| 項目 | 制限 |
|---|---|
| 1日あたりのリクエスト | 500リクエスト |
| 1分あたりのリクエスト | 300リクエスト |
| 1日あたりの読み取りリクエスト | 60,000リクエスト |
個人プロジェクトや小規模の自動化であれば、この無料枠内で十分に対応できます。
無料枠を超えた場合
| 料金 | 詳細 |
|---|---|
| $1.50 USD | 100,000リクエストごと |
クォータと制限
デフォルトでは、以下の制限が設定されています。
| 制限項目 | デフォルト値 |
|---|---|
| 1分あたりのリクエスト数 | 300 |
| 1日あたりのリクエスト数 | 60,000 |
| 1ユーザーあたり100秒のリクエスト | 100 |
これらの制限はGoogle Cloud Consoleで調整可能ですが、追加料金が発生する場合があります。
コスト管理のベストプラクティス
# リクエスト数を削減するためのキャッシュ実装例
from functools import lru_cache
import time
class SheetsAPICache:
def __init__(self, ttl=300): # 5分間キャッシュ
self.cache = {}
self.ttl = ttl
def get(self, key):
if key in self.cache:
value, timestamp = self.cache[key]
if time.time() - timestamp < self.ttl:
return value
del self.cache[key]
return None
def set(self, key, value):
self.cache[key] = (value, time.time())
# 使用例
cache = SheetsAPICache()
def read_with_cache(spreadsheet_id, range_name):
cache_key = f"{spreadsheet_id}:{range_name}"
# キャッシュをチェック
cached = cache.get(cache_key)
if cached:
return cached
# APIを呼び出し
data = read_spreadsheet(spreadsheet_id, range_name)
cache.set(cache_key, data)
return data
予算アラートの設定
Google Cloud Consoleで予算アラートを設定することで、コストを管理できます。
- Cloud Consoleの「お支払い」→「予算とアラート」に移動
- 「予算を作成」をクリック
- 予算額と通知のしきい値を設定
- 通知先のメールアドレスを設定
注意点
- 認証情報の管理:
credentials.jsonとtoken.jsonには機密情報が含まれているため、必ず安全に保管し、公開リポジトリにアップロードしないでください。.gitignoreに追加することを推奨します。
# Google API credentials
credentials.json
token.json
- スコープの選択: 必要最小限のスコープを使用することで、セキュリティを向上させることができます。
| スコープ | 用途 |
|---|---|
spreadsheets.readonly | 読み取りのみ |
spreadsheets | 読み書き |
drive.readonly | Driveファイルの読み取り |
まとめ
Google Sheets APIは、個人使用や小規模プロジェクトであれば、実質無料で利用できる強力なツールです。認証設定は最初は少し手間がかかりますが、一度設定してしまえば、スプレッドシートの自動化や大量データの効率的な操作が可能になります。
大規模なプロジェクトでの使用や高頻度なAPI呼び出しを行う場合は、料金が発生する可能性があるため、バッチリクエストやキャッシュの活用でAPIコール数を削減し、予算アラートを設定してコスト管理を行うことが重要です。