【自動日記ツール】Googleでアップスクリプトの作成:前編
そんな欲望をもとに考えた一連の仕組みがあるので、今日は、それを紹介します。
本記事だけを読んでも意味がわからないと思いますが、もし、興味のある方は、一連の流れを以下の記事にしていますので、こちらをご参照ください。
今回は、ついに、本ツールの本懐になるGoogle Apps Script、通称GASの設定になります。
全工程のうち、以下のチャートに当たる部分の設定を一気に行います。
スクリプトプロパティの設定
「歯車マーク プロジェクトの設定」を開きます
画面下部にスクロールすると、「スクリプト プロパティ」というものがありますので、「スクリプト プロパティを追加」を押下します。
スクリプト プロパティには、以下の内容を入れてください。
このとき、「プロパティ」の名前は、ここで指定している文字と、一字一句間違えないように入れます
GCalendarID
GDrive
Gmail
OpenAI_key
GASで呼び出す名前になるため、間違えた名前で呼ぶと動かないためです
GCalendarID
情報を取得するカレンダーです
以下のサイトを参考にカレンダーIDを見つけて、「値」に入力します
GDrive
作成された日記の保存先になります
作成された日記は、Googleドキュメントとして、設定されたドライブに保存されます
以下のサイトを参考にドライブIDを見つけて、「値」に入力します
Gmail
日記が作成されたら、ここで設定されたメアドあてに連絡が届きます
ご自身のメールアドレスを「値」に入力します
OpenAI_key
日記やイラストを作成するために使用します
以下のサイトを参考にAPIkeyを発行して、「値」に入力します
全工程を指示するGASの設定
「+」マークから「スクリプト」を選択し、新しい「~~.gs」を作ります。
この名前は好きな名前で構いません。
今回は、毎日日記を書いてもらうので、「daily」としました。
「daily.gs」の内容に、以下をコピペします
function generateDailyDiaryAndIllustrateEvent() {
// 日記の内容とヘッダー情報を準備
const {combinedContent, headers} = prepareDiaryComponents('B2');
// APIエンドポイントのURL
const apiUrl = 'https://api.openai.com/v1/chat/completions';
const imageUrlApi = 'https://api.openai.com/v1/images/generations';
// 日記を生成するためのAPIリクエストオプションを構築
const diaryOptions = buildApiRequestOptions(headers, combinedContent);
// 日記内容を取得
const diaryContent = fetchDiaryContent(apiUrl, diaryOptions);
if (!diaryContent) return; // 日記の内容が取得できなかった場合、処理を終了
// 日記の内容をGoogleドキュメントに保存し、ドキュメントIDを取得
const docId = saveDiaryToDocument(diaryContent, 'diary');
// 特徴的な出来事を抽出
const extractedEvent = extractEventFromDiary(apiUrl, headers, diaryContent);
if (!extractedEvent) return; // 特徴的な出来事が抽出できなかった場合、処理を終了
// 抽出された特徴的な出来事に関するログ出力
console.log(`抽出された特徴的な出来事: ${extractedEvent}`);
// 特徴的な出来事からイラスト化プロンプトを作成
const illustrationPrompt = createIllustrationPrompt(extractedEvent);
// 作成されたイラスト化プロンプトに関するログ出力
console.log(`イラスト化プロンプト: ${illustrationPrompt}`);
// イラストをリクエストするためのオプションを構築
let imageOptions = buildImageRequestOptions(illustrationPrompt);
// DALL-Eにイラストをリクエストし、Googleドキュメントの冒頭に挿入
requestIllustration(imageUrlApi, imageOptions, docId);
}
このコードが、文中に記載のとおり、日記を作成してから保存するまでの工程を全て指示するGASになります。
そのため、イラストの作成は不要な方は、その部分だけ省いても動きます。多分。
日記を書くGASの設定
おなじように、日記を書くGASを設定します
function prepareDiaryComponents(activityRange) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('inputData');
const activityData = sheet.getRange(activityRange).getValue();
const promptData = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('prompt').getRange('B2').getValue();
const combinedContent = promptData + activityData; // B2と活動データを結合
const headers = {
'Authorization': 'Bearer ' + ScriptProperties.getProperty('OpenAI_key'),
'Content-type': 'application/json',
'X-Slack-No-Retry': 1
};
return {combinedContent, headers};
}
function buildApiRequestOptions(headers, combinedContent) {
return {
'muteHttpExceptions': true,
'headers': headers,
'method': 'POST',
'payload': JSON.stringify({
'model': 'gpt-4-turbo-preview',
'max_tokens': 1500,
'temperature': 0.7,
'messages': [
{
'role': 'system',
'content': combinedContent
}
]
})
};
}
function fetchDiaryContent(apiUrl, options) {
const response = UrlFetchApp.fetch(apiUrl, options);
const jsonResponse = JSON.parse(response.getContentText());
if (jsonResponse.error && jsonResponse.error.code === 'insufficient_quota') {
console.log('クォータ超過のため、APIリクエストに失敗しました。');
return null;
}
if (jsonResponse.choices && jsonResponse.choices.length > 0) {
return jsonResponse.choices[0].message.content;
} else {
console.log('APIレスポンスにchoicesが含まれていません。');
return null;
}
}
ドキュメントを保存するGASの設定
function saveDiaryToDocument(diaryContent, docType) {
const gDriveId = ScriptProperties.getProperty('GDrive');
const folder = DriveApp.getFolderById(gDriveId);
const today = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyyMMdd');
const docTitle = `${docType}_${today}`;
const doc = DocumentApp.create(docTitle);
doc.getBody().setText(diaryContent);
const docFile = DriveApp.getFileById(doc.getId());
folder.addFile(docFile);
sendDocumentCreationNotification(docTitle, docFile.getUrl());
return doc.getId();
}
function sendDocumentCreationNotification(docTitle, docUrl) {
const email = ScriptProperties.getProperty('Gmail'); // スクリプトプロパティからメールアドレスを取得
const subject = '新しい日記ドキュメントが作成されました';
const body = `タイトル: ${docTitle}\nURL: ${docUrl}\n\nこのドキュメントをチェックしてください。`;
MailApp.sendEmail({
to: email,
subject: subject,
body: body
});
}
テストで実行してみる
テスト結果を確認する
この記事が気に入ったらサポートをしてみませんか?