Gemini × Google Apps Script で業務自動化
Google Apps Script(GAS)は、Google Workspace の各サービスをプログラムで操作できる強力なプラットフォームです。ここに Gemini API を組み合わせることで、スプレッドシートのデータ分析、メールの自動分類・要約、ドキュメントの下書き生成など、日常業務の大幅な効率化が可能になります。
このガイドでは、GAS から Gemini API を呼び出す基本的なセットアップから、実践的な自動化ワークフローの構築まで、ステップバイステップで解説します。
なぜ GAS × Gemini なのか
Google Apps Script と Gemini API を組み合わせるメリットは多岐にわたります。
まず、ゼロインフラで始められる点が大きな利点です。GAS は Google のサーバー上で動作するため、外部サーバーの用意やデプロイ作業が不要です。スクリプトエディタを開くだけで即座に開発を始められます。
次に、Google Workspace との深い統合があります。Gmail、スプレッドシート、ドキュメント、カレンダー、ドライブなど、普段使っているツールのデータに直接アクセスできます。API キーの取得とわずかなコードで、これらのデータを Gemini に渡して分析・生成を行えます。
さらに、トリガーによる完全自動化が可能です。時間ベースのトリガーやスプレッドシートの編集トリガーを設定すれば、人の介在なしに定期的な処理を実行できます。
セットアップ
1. Gemini API キーの取得
Google AI Studio(aistudio.google.com)にアクセスし、API キーを生成します。生成したキーはスクリプトプロパティに安全に保存しましょう。
2. Apps Script プロジェクトの作成
Google スプレッドシートを開き、メニューから「拡張機能」→「Apps Script」を選択します。新しいスクリプトエディタが開いたら、まず API キーをスクリプトプロパティに保存します。
// 初回のみ実行:APIキーをスクリプトプロパティに保存
function setApiKey() {
const scriptProperties = PropertiesService.getScriptProperties();
scriptProperties.setProperty('GEMINI_API_KEY', 'your-api-key-here');
}3. Gemini API を呼び出す共通関数
以下の関数を作成しておくと、様々な自動化で再利用できます。
function callGemini(prompt, model = 'gemini-2.5-flash') {
const apiKey = PropertiesService.getScriptProperties()
.getProperty('GEMINI_API_KEY');
const url = `https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent?key=${apiKey}`;
const payload = {
contents: [{ parts: [{ text: prompt }] }],
generationConfig: {
temperature: 0.7,
maxOutputTokens: 2048
}
};
const options = {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify(payload),
muteHttpExceptions: true
};
const response = UrlFetchApp.fetch(url, options);
const json = JSON.parse(response.getContentText());
if (json.candidates && json.candidates[0]) {
return json.candidates[0].content.parts[0].text;
}
throw new Error('Gemini API エラー: ' + response.getContentText());
}実践ワークフロー
ワークフロー1: スプレッドシートのデータを自動分析
売上データやアンケート結果が蓄積されたスプレッドシートを、Gemini に渡して自動的に分析レポートを生成する例です。
function analyzeSalesData() {
const sheet = SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName('売上データ');
const data = sheet.getDataRange().getValues();
const headers = data[0];
const rows = data.slice(1);
// データをテキスト形式に変換
const csvText = [headers.join(','),
...rows.map(row => row.join(','))
].join('\n');
const prompt = `以下の売上データを分析し、主要なトレンド、
注目すべきポイント、改善提案を日本語で簡潔にまとめてください。
データ:
${csvText}
以下の観点で分析してください:
1. 売上の全体的なトレンド
2. カテゴリ別のパフォーマンス
3. 改善が必要な領域
4. 具体的なアクションの提案`;
const analysis = callGemini(prompt);
// 結果を新しいシートに書き込む
let resultSheet = SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName('AI分析');
if (!resultSheet) {
resultSheet = SpreadsheetApp.getActiveSpreadsheet()
.insertSheet('AI分析');
}
resultSheet.getRange('A1').setValue('分析日時');
resultSheet.getRange('B1').setValue(new Date());
resultSheet.getRange('A3').setValue(analysis);
}ワークフロー2: Gmail の受信メールを自動要約
毎朝、未読メールの要約を生成してスプレッドシートに記録するワークフローです。
function summarizeUnreadEmails() {
const threads = GmailApp.search('is:unread', 0, 20);
const summaries = [];
for (const thread of threads) {
const messages = thread.getMessages();
const latest = messages[messages.length - 1];
const prompt = `以下のメールを1〜2文で要約し、
緊急度(高・中・低)を判定してください。
件名: ${latest.getSubject()}
送信者: ${latest.getFrom()}
本文: ${latest.getPlainBody().substring(0, 1000)}
JSON形式で回答:
{"summary": "要約文", "urgency": "高|中|低"}`;
try {
const result = callGemini(prompt);
const parsed = JSON.parse(
result.replace(/```json\n?/g, '').replace(/```/g, '')
);
summaries.push([
new Date(),
latest.getFrom(),
latest.getSubject(),
parsed.summary,
parsed.urgency
]);
} catch (e) {
summaries.push([
new Date(),
latest.getFrom(),
latest.getSubject(),
'要約失敗',
'-'
]);
}
}
if (summaries.length > 0) {
const sheet = SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName('メール要約')
|| SpreadsheetApp.getActiveSpreadsheet()
.insertSheet('メール要約');
const lastRow = sheet.getLastRow();
sheet.getRange(lastRow + 1, 1, summaries.length, 5)
.setValues(summaries);
}
}ワークフロー3: ドキュメントの下書き自動生成
スプレッドシートに入力したトピックから、Google ドキュメントの下書きを自動生成する例です。
function generateDocumentDraft() {
const sheet = SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName('ドキュメント依頼');
const data = sheet.getDataRange().getValues();
for (let i = 1; i < data.length; i++) {
const [topic, audience, length, status] = data[i];
if (status === '完了') continue;
const prompt = `以下の条件でビジネスドキュメントの下書きを
作成してください。
トピック: ${topic}
対象読者: ${audience}
分量: ${length}
構成をしっかりとした見出し付きで作成してください。`;
const draft = callGemini(prompt);
// Google ドキュメントとして保存
const doc = DocumentApp.create(`[AI下書き] ${topic}`);
doc.getBody().setText(draft);
// ステータスを更新
sheet.getRange(i + 1, 4).setValue('完了');
sheet.getRange(i + 1, 5).setValue(doc.getUrl());
}
}トリガーの設定
GAS のトリガー機能を使えば、上記のワークフローを完全に自動化できます。
function createTriggers() {
// 毎朝8時にメール要約を実行
ScriptApp.newTrigger('summarizeUnreadEmails')
.timeBased()
.everyDays(1)
.atHour(8)
.create();
// 毎週月曜に売上分析を実行
ScriptApp.newTrigger('analyzeSalesData')
.timeBased()
.onWeekDay(ScriptApp.WeekDay.MONDAY)
.atHour(9)
.create();
}スクリプトエディタの「トリガー」メニューから GUI で設定することもできます。複雑な条件が必要な場合は、コードで設定する方が柔軟に対応できます。
エラーハンドリングとレート制限
本番運用では、API 呼び出しの失敗に備えたエラーハンドリングが重要です。
function callGeminiWithRetry(prompt, maxRetries = 3) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
return callGemini(prompt);
} catch (e) {
if (attempt === maxRetries - 1) throw e;
// 指数バックオフで待機
Utilities.sleep(Math.pow(2, attempt) * 1000);
}
}
}GAS には1日の実行時間制限(無料アカウントで6分/実行、90分/日)があるため、大量のデータを処理する場合はバッチ処理を検討しましょう。処理の進捗をスクリプトプロパティに保存し、複数回に分けて実行するパターンが有効です。
セキュリティのベストプラクティス
API キーの管理には十分注意が必要です。コード内にハードコードせず、必ずスクリプトプロパティを使用してください。また、スクリプトを共有する際は、プロパティに保存されたキーが他のユーザーからアクセスされる可能性がある点に注意しましょう。
機密性の高いデータを Gemini API に送信する場合は、組織のデータポリシーを確認してください。Google Workspace の管理者設定で、Apps Script から外部 API への接続を制限している場合もあります。
全体を振り返って
Google Apps Script と Gemini API の組み合わせは、プログラミング経験が少ない方でも始めやすい業務自動化の手段です。スプレッドシートのデータ分析、メールの自動処理、ドキュメント生成など、日常的な業務を大幅に効率化できます。まずは小さなワークフローから始めて、徐々に自動化の範囲を広げていくのがおすすめです。