## Google Cloud Platform (GCP) で設定
GCPでGoogle Sheets APIをenableにします。
APIの認証情報(Credential)として、サービスアカウントを作成し、JSON形式のキーファイルをダウンロード(credentials.json)
## スプレッドシートの共有設定
スプレッドシートの右上の「共有」ボタンをクリックし、先ほど作成したサービスアカウントのメールアドレスを**編集者(Editor)**として追加します。
## Node.jsでライブラリをインストール
$ npm install google-auth-library googleapis
chat-sheet.js
import fs from "fs";
import fetch from "node-fetch";
import { google } from "googleapis";
// Google Sheets APIの設定
const sheets = google.sheets({ version: "v4" });
const auth = new google.auth.GoogleAuth({
keyFile: "./credentials.json", // ダウンロードしたキーファイルのパス
scopes: ["https://www.googleapis.com/auth/spreadsheets"],
});
const SPREADSHEET_ID = "***"; // スプレッドシートのURLから取得できるID
const DIFY_API_KEY = "app-***";
const API_URL = "https://api.dify.ai/v1/chat-messages";
const prompts = fs
.readFileSync("./prompts.txt", "utf8")
.split("\n")
.map((line) => line.trim())
.filter(Boolean);
// Difyに問い合わせる関数
async function callDify(prompt) {
const response = await fetch(API_URL, {
method: "POST",
headers: {
"Authorization": `Bearer ${DIFY_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
inputs: {},
query: prompt,
response_mode: "blocking",
conversation_id: "",
user: "cli-user",
}),
});
if (!response.ok) {
const err = await response.text();
throw new Error(`API Error ${response.status}: ${err}`);
}
const data = await response.json();
return data.answer || "(No answer)";
}
// スプレッドシートに結果を保存する関数
async function saveToGoogleSheets(results) {
const client = await auth.getClient();
google.options({ auth: client });
const values = results.map(row => [row.prompt, row.answer, row.error]);
const resource = {
values: [["質問", "回答", "エラー"], ...values], // ヘッダー行を追加
};
try {
await sheets.spreadsheets.values.clear({
spreadsheetId: SPREADSHEET_ID,
range: "Sheet1!A:C", // 既存のデータをクリア(必要に応じて)
});
await sheets.spreadsheets.values.update({
spreadsheetId: SPREADSHEET_ID,
range: "Sheet1!A1",
valueInputOption: "RAW",
resource,
});
console.log("\n=== 回答をGoogleスプレッドシートに保存しました ===");
} catch (error) {
console.error("スプレッドシートへの書き込みエラー:", error.message);
}
}
// メイン処理
(async () => {
const results = [];
for (const [i, prompt] of prompts.entries()) {
try {
const answer = await callDify(prompt);
results.push({ prompt, answer, error: "" });
// CLIに出力
console.log(`Q${i + 1}: ${prompt}`);
console.log(`A${i + 1}: ${answer}\n`);
} catch (err) {
results.push({ prompt, answer: "", error: err.message });
console.error(`Error for "${prompt}": ${err.message}`);
}
}
// Googleスプレッドシートに保存
await saveToGoogleSheets(results);
// (オプション)テキストファイルにも保存
const textOutput = results
.map((res) => `Q: ${res.prompt}\nA: ${res.answer || res.error}\n`)
.join("\n");
fs.writeFileSync("results.txt", textOutput, "utf8");
console.log("=== 回答を results.txt にも保存しました ===");
})();

ほう、なるほど