【Python】Pandas+Google Drive API+GASでスプレッドシートの自動集計&通知アプリを構築する

はじめに

Python はデータ処理に強く、特に pandas を使えばCSVの集計・変換が容易です。一方、GAS(Google Apps Script)はGoogleサービスとネイティブ連携でき、通知処理も簡単です。この2つを連携させることで、データ集計から共有・通知までの一連の作業を全自動化できます。

構成概要と必要な定数の意味

本システムの流れは以下の通りです。

1. Python でローカルのCSVを集計(Pandas使用)

2. Google Drive APIを使って指定フォルダにアップロード

3. GAS がそのファイルを取得し、スプレッドシートを更新

4. GASでメールまたはSlackに通知

コードで使用する主な定数は下記のとおりです。

  • service_account.json:Google Cloud Platformで作成したサービスアカウントの認証情報(Python側のDrive API用)
  • SCOPES:APIで許可する権限。ここではDriveファイル作成権限(https://www.googleapis.com/auth/drive.file)
  • GAS_INPUT_FOLDER_ID:Google Drive上の、GASがCSVを取得するためのフォルダID(URLのfolders/の後の部分)
  • SPREADSHEET_ID:更新対象のスプレッドシートID(URLの/d/の後の部分)
  • YOUR_SLACK_WEBHOOK_URL:SlackのIncoming Webhook URL(Slack App管理画面で発行)

Python 側 — CSV集計とGoogle Driveアップロード

まず、Pandasで売上CSVを日次集計します。その後、Google Drive APIを使い、GAS_INPUT_FOLDER_IDのフォルダにアップロードします。

import pandas as pd
from googleapiclient.discovery import build
from googleapiclient.http import MediaFileUpload
from google.oauth2.service_account import Credentials

# ===== 定数 =====
SCOPES = ['https://www.googleapis.com/auth/drive.file']
SERVICE_ACCOUNT_FILE = 'service_account.json'  # サービスアカウント認証ファイル
GAS_INPUT_FOLDER_ID = 'xxxxxxxxxxxxxxxxxxxxxxxx'  # DriveフォルダID

# ===== CSV集計 =====
df = pd.read_csv('sales.csv', parse_dates=['date'])
daily = df.groupby(df['date'].dt.date)['amount'].sum().reset_index()
daily.to_csv('daily_sales.csv', index=False)

# ===== Driveアップロード =====
creds = Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
service = build('drive', 'v3', credentials=creds)

file_metadata = {
    'name': 'daily_sales.csv',
    'parents': [GAS_INPUT_FOLDER_ID]
}
media = MediaFileUpload('daily_sales.csv', mimetype='text/csv')
service.files().create(body=file_metadata, media_body=media).execute()

GAS 側 — CSV読込・スプレッドシート更新・通知

GASでは、Driveフォルダを監視し、最新のdaily_sales.csvを取得してスプレッドシートに反映します。その後、メール通知とSlack通知を行います。

// ===== 定数 =====
const GAS_INPUT_FOLDER_ID = 'xxxxxxxxxxxxxxxxxxxxxxxx'; // DriveフォルダID
const SPREADSHEET_ID = 'yyyyyyyyyyyyyyyyyyyyyyyyyyyy'; // スプレッドシートID
const YOUR_SLACK_WEBHOOK_URL = 'https://hooks.slack.com/services/zzzzzzzz'; // Slack Webhook URL

function importAndNotify() {
  const folder = DriveApp.getFolderById(GAS_INPUT_FOLDER_ID);
  const files = folder.getFilesByName('daily_sales.csv');
  if (!files.hasNext()) return;

  const file = files.next();
  const csv = Utilities.parseCsv(file.getBlob().getDataAsString());
  const sheet = SpreadsheetApp.openById(SPREADSHEET_ID).getSheetByName('Sales');
  sheet.clearContents();
  sheet.getRange(1, 1, csv.length, csv[0].length).setValues(csv);

  // メール通知
  MailApp.sendEmail({
    to: 'you@example.com',
    subject: '日次売上集計結果',
    body: '最新の集計結果をスプレッドシートで確認してください。'
  });

  // Slack通知
  const payload = JSON.stringify({ text: '日次売上が更新されました!' });
  UrlFetchApp.fetch(YOUR_SLACK_WEBHOOK_URL, {
    method: 'post',
    contentType: 'application/json',
    payload: payload
  });
}

運用時の注意点と拡張アイデア

認証情報の管理service_account.jsonは外部公開しないように注意。

Driveフォルダの整理:古いCSVは自動削除スクリプトを作ると便利。

Slack通知のカスタマイズ:集計結果の概要(合計金額や前日比など)を通知本文に含めるとより実用的。

トリガー設定:GASのタイムトリガーを使えば、指定時間に自動更新可能。

おわりに

Python と Pandas での集計処理と、Google Drive API・GAS を組み合わせたワークフローは、日々のデータ更新や共有をほぼ完全に自動化できます。手作業でのコピー&ペーストや集計作業が不要になるだけでなく、Slack やメールによる即時通知で、関係者全員が最新情報にアクセスできます。
この記事の方法を基に、ファイル命名規則や通知内容を自分の業務に合わせてカスタマイズすれば、より効率的でミスのないデータ運用環境が構築できるでしょう。まずは小さなデータセットから試し、段階的に運用に組み込んでみてください。

また、APIの仕様変更やうまく動作しないなどがありましたら、遠慮なくコメントまでお寄せください!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です