「整理券(APIキー)」を「金庫(スクリプトプロパティ)」に収めたら、次に行うべきはマザーシステムの構築です。
このブログでは、すべてのAPIキーを「マザーシステム」という一つのプロジェクトに集約します。今後作成するスプレッドシートやツールからは、このマザーシステムを「ライブラリ」として読み込むことで、面倒なキーの設定を一度きりで終わらせます。
1. マザーシステムの構築とキーの最終チェック
まずは核となるプロジェクトを作成し、金庫の中身を揃えましょう。
- Google Apps Scriptにアクセスし、「新しいプロジェクト」をクリック。
- プロジェクト名を「マザーシステム」に変更します。
- 「プロジェクトの設定(歯車アイコン)」を開き、以下のプロパティがすべて入力されているか確認してください。
| 分野 | プロパティ名(名前) | 必要な値 |
|---|---|---|
| AI | GEMINI_API_KEY | Google AI Studioのキー |
| 通知 | LINE_TOKEN | LINE Notify等のトークン |
| 通知 | SLACK_WEBHOOK_URL | SlackのWebhook URL |
| 通知 | DISCORD_WEBHOOK_URL | DiscordのWebhook URL |
| 整理 | NOTION_API_KEY | Notionインテグレーションキー |
| 整理 | TRELLO_KEY / TRELLO_TOKEN | TrelloのKeyとToken |
| 情報 | OPENWEATHER_API_KEY | OpenWeatherMapのキー |
| 情報 | QIITA_TOKEN | Qiitaの個人用トークン |
第1部:全API「一括通信診断」プログラム
マザーシステムの「コード.gs」を以下に書き換え、保存してから checkAllAPIs を実行してください。どの鍵が壊れているか、あるいは有効かを一気にあぶり出します。
/**
* 全API一括疎通確認スクリプト
*/
function checkAllAPIs() {
const props = PropertiesService.getScriptProperties().getProperties();
const results = [];
const verify = (name, url, options = {}) => {
try {
const res = UrlFetchApp.fetch(url, options);
const code = res.getResponseCode();
if (code >= 200 && code < 300) {
results.push(`✅ ${name}: 疎通成功`);
} else {
results.push(`❌ ${name}: エラー (Status: ${code}) - 設定を確認してください`);
}
} catch (e) {
results.push(`❌ ${name}: 接続失敗 - キーが未登録、またはURLが誤っています (${e.message})`);
}
};
console.log("--- 診断プロセス開始 ---");
// 1. AI: Gemini
verify("Gemini", `https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=${props.GEMINI_API_KEY}`,
{ method: "post", contentType: "application/json", payload: JSON.stringify({contents:[{parts:[{text:"Hi"}]}]}), muteHttpExceptions: true });
// 2. 通知: Slack / LINE / Discord
verify("Slack", props.SLACK_WEBHOOK_URL, { method: "post", payload: JSON.stringify({text:"Check"}), muteHttpExceptions: true });
verify("LINE", "https://notify-api.line.me/api/notify", { method: "post", headers: { Authorization: `Bearer ${props.LINE_TOKEN}` }, payload: { message: "Check" }, muteHttpExceptions: true });
verify("Discord", props.DISCORD_WEBHOOK_URL, { method: "post", contentType: "application/json", payload: JSON.stringify({content:"Check"}), muteHttpExceptions: true });
// 3. 情報: Qiita / Weather
verify("Qiita", "https://qiita.com/api/v2/authenticated_user", { headers: { Authorization: `Bearer ${props.QIITA_TOKEN}` }, muteHttpExceptions: true });
verify("Weather", `https://api.openweathermap.org/data/2.5/weather?q=Tokyo&appid=${props.OPENWEATHER_API_KEY}`, { muteHttpExceptions: true });
// 4. 整理: Notion / Trello (認証形式が特殊なため簡易チェック)
if(props.NOTION_API_KEY) results.push("ℹ️ Notion: キー登録済み (連携時に詳細テスト)");
if(props.TRELLO_KEY && props.TRELLO_TOKEN) results.push("ℹ️ Trello: キー/トークン登録済み");
results.forEach(r => console.log(r));
console.log("--- 診断プロセス終了 ---");
}
第2部:マザーシステムを「核」にするための連携手順
💡 なぜ一つのプロジェクトにまとめるのか?
GASの「金庫(スクリプトプロパティ)」は、プロジェクトごとに独立しています。レシピごとに新しいプロジェクトを作ると、その度に重いAPIキーをコピペし直さなければなりません。
マザーシステムをライブラリ化して各ツールに集約することで、「一度設定すれば、一生使い回せる」環境が完成します。
マザーシステムを「ライブラリ化」することで、外部のスプレッドシートなどからその機能を呼び出せるようにします。
手順A:マザーシステムを公開する
- エディタ右上の「デプロイ」>「新しいデプロイ」をクリック。
- 種類の選択で「ライブラリ」を選び、説明に「MotherSystem v1」と入力してデプロイ。
- 発行された「ライブラリ ID(スクリプト ID)」をコピーします。
手順B:別のプロジェクトから呼び出す
- 新しいスプレッドシートを作成し、拡張機能>Apps Scriptを開きます(これが各ツールのサブシステムになります)。
- 左メニューの「ライブラリ」の横にある「+」をクリック。
- 先ほどコピーした「スクリプト ID」を貼り付けて検索。
- 最新バージョンを選択し、IDを「MotherSystem」にして追加します。
第3部:統合実戦!全APIが連動する「全自動モーニング・ブリーフィング」
開通式の締めくくりとして、これまでに準備した8つのAPI窓口をすべて繋いだドリーム・システムを動かしてみましょう。
このプログラムは、「天気と技術情報を取得」し、「AIが要約」し、「すべてのSNSへ通知」しながら「Notionへ記録」するという、自動化の全行程を網羅しています。
/**
* マザーシステム:全API統合ブリーフィング
*/
function runFullSystemDemo() {
const props = PropertiesService.getScriptProperties().getProperties();
console.log("全システム起動...");
// 1. 情報収集:天気とQiitaトレンド
const weatherRes = UrlFetchApp.fetch(`https://api.openweathermap.org/data/2.5/weather?q=Tokyo&appid=${props.OPENWEATHER_API_KEY}&lang=ja&units=metric`);
const qiitaRes = UrlFetchApp.fetch("https://qiita.com/api/v2/items?page=1&per_page=1");
const weather = JSON.parse(weatherRes.getContentText()).weather[0].description;
const qiita = JSON.parse(qiitaRes.getContentText())[0].title;
// 2. AI:Geminiに今日の要約を依頼
const geminiUrl = `https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=${props.GEMINI_API_KEY}`;
const prompt = `天気:${weather}、最新ニュース:${qiita}\nこれらを元に、自動化エンジニアへの「朝の挨拶」を40文字で作って。`;
const aiRes = UrlFetchApp.fetch(geminiUrl, {
method: "post", contentType: "application/json",
payload: JSON.stringify({ contents: [{ parts: [{ text: prompt }] }] })
});
const aiMsg = JSON.parse(aiRes.getContentText()).candidates[0].content.parts[0].text;
// 3. 通知:Slack / LINE / Discord への一斉送信
const finalMsg = `【Morning System】\n${aiMsg}\n(天気:${weather} / 記事:${qiita})`;
UrlFetchApp.fetch(props.SLACK_WEBHOOK_URL, { method: "post", payload: JSON.stringify({ text: finalMsg }) });
UrlFetchApp.fetch(props.DISCORD_WEBHOOK_URL, { method: "post", contentType: "application/json", payload: JSON.stringify({ content: finalMsg }) });
UrlFetchApp.fetch("https://notify-api.line.me/api/notify", {
method: "post", headers: { Authorization: `Bearer ${props.LINE_TOKEN}` }, payload: { message: finalMsg }
});
// 4. 記録:Notionへのログ保存
UrlFetchApp.fetch(`https://api.notion.com/v1/pages`, {
method: "post",
headers: { "Authorization": `Bearer ${props.NOTION_API_KEY}`, "Notion-Version": "2022-06-28", "Content-Type": "application/json" },
payload: JSON.stringify({ "parent": { "database_id": "DATABASE_ID_HERE" }, "properties": { "title": { "title": [{ "text": { "content": aiMsg } }] } } }),
muteHttpExceptions: true
});
console.log("マザーシステム:全行程を正常に完了しました。");
}
これで、あなたのGoogleアカウント全体で共有できる「最強の自動化コア」が完成しました。明日から紹介する個別のレシピは、このマザーシステムに接続して、機能をどんどん拡張していく形になります。
準備完了:
診断結果がすべてOKなら、あなたの自動化環境は完璧です。次回のレシピから、具体的な業務ハックを開始しましょう!
コメント
コメントを投稿