【GAS】Google Sheets API - 認証設定と料金体系を解説

PUBLISHED 2024-10-14

概要

Google Sheets APIを活用するための認証手順と料金体系について詳しく解説します。このAPIを使えば、スプレッドシートの操作を自動化したり、効率的にデータを処理することができます。APIを通じて、スプレッドシート上のデータにアクセスし、読み書きや更新が可能になります。

Google Sheets APIは、個人プロジェクトから企業での利用に至るまで、さまざまなニーズに応えることができる柔軟性を持っています。この記事では、Google Sheets APIの認証設定方法から料金体系まで、必要な情報をすべてカバーします。

認証情報の取得手順

Google Sheets APIを使用するには、まず認証情報を取得して設定する必要があります。以下の手順に沿って設定していきましょう。

credentials.jsonの取得

  1. Google Cloud Consoleにアクセスし、新しいプロジェクトを作成するか、既存のプロジェクトを選択します。
  2. 左側のメニューから「APIとサービス」→「ライブラリ」を選択。
  3. 検索バーで「Google Sheets API」を検索し、APIを有効にします。
  4. 「認証情報を作成」ボタンをクリックし、以下のように設定を行います:
    • 「どのAPIを使用していますか?」→「Google Sheets API」
    • 「どこからAPIを呼び出しますか?」→「その他のUI(Windows、CLIツールなど)」
    • 「アクセスするデータの種類は?」→「ユーザーデータ」
  5. OAuthクライアントIDを作成する画面でアプリケーション名などの詳細を入力。
  6. 認証情報ページに戻り、OAuth 2.0クライアントIDの横にある下向き矢印をクリックし、「JSONをダウンロード」を選択します。
  7. ダウンロードしたJSONファイルをcredentials.jsonとして保存し、スクリプトと同じディレクトリに配置します。

token.jsonの生成

  1. token.jsonはスクリプトを初めて実行したときに自動生成されます。
  2. スクリプト実行時にブラウザが開き、Googleアカウントでの認証を求められます。
  3. 認証に成功すると、token.jsonが自動的に生成され、スクリプトのディレクトリに保存されます。

環境変数の設定

credentials.jsontoken.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 USD100,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で予算アラートを設定することで、コストを管理できます。

  1. Cloud Consoleの「お支払い」→「予算とアラート」に移動
  2. 「予算を作成」をクリック
  3. 予算額と通知のしきい値を設定
  4. 通知先のメールアドレスを設定

注意点

  • 認証情報の管理: credentials.jsontoken.jsonには機密情報が含まれているため、必ず安全に保管し、公開リポジトリにアップロードしないでください。.gitignoreに追加することを推奨します。
# Google API credentials
credentials.json
token.json
  • スコープの選択: 必要最小限のスコープを使用することで、セキュリティを向上させることができます。
スコープ用途
spreadsheets.readonly読み取りのみ
spreadsheets読み書き
drive.readonlyDriveファイルの読み取り

まとめ

Google Sheets APIは、個人使用や小規模プロジェクトであれば、実質無料で利用できる強力なツールです。認証設定は最初は少し手間がかかりますが、一度設定してしまえば、スプレッドシートの自動化や大量データの効率的な操作が可能になります。

大規模なプロジェクトでの使用や高頻度なAPI呼び出しを行う場合は、料金が発生する可能性があるため、バッチリクエストやキャッシュの活用でAPIコール数を削減し、予算アラートを設定してコスト管理を行うことが重要です。

参考文献

CATEGORY
TAGS
円