ChatGPT APIとGAS連携!業務効率化を加速させる方法
/ 初心者向け
ChatGPT APIとGAS連携!業務効率化を加速させる方法
皆さん、こんにちは!Google Apps Script (GAS) の専門ブロガー、[あなたの名前]です。
近年、AIの進化は目覚ましく、特にChatGPTはその自然な対話能力で多くの人々を魅了しています。この強力なAIを、皆さんが日常的に利用しているGoogle Workspace(Gmail, スプレッドシート, ドキュメントなど)とGASを連携させることで、業務効率を劇的に向上させることが可能です。今回は、ChatGPT APIとGASを連携させる方法を、初心者の方にも分かりやすく解説していきます。
なぜGASとChatGPT APIを連携させるのか?
GASはGoogle Workspaceの様々なサービスを自動化できる強力なスクリプト言語です。一方、ChatGPT APIは、高度な自然言語処理能力を持つAIモデルにアクセスできるインターフェースです。
この二つを組み合わせることで、以下のようなことが実現できます。
- メールの自動返信・要約: 受信したメールの内容をChatGPTが理解し、適切な返信文を作成したり、長文メールを要約したりできます。
- スプレッドシートでの文章生成・分析: スプレッドシートのデータをもとに、商品説明文やブログ記事のアイデアを生成したり、顧客からのフィードバックを分析したりできます。
- ドキュメントの校正・翻訳: 書いた文章の校正や、多言語への翻訳を自動で行えます。
- チャットボットの作成: 社内向けのFAQボットや、簡単な問い合わせ対応ボットをGASとChatGPTで作成できます。
これらはほんの一例です。アイデア次第で、あなたの業務をさらに効率化できる可能性は無限大です。
事前準備:ChatGPT APIキーの取得
まず、ChatGPT APIを利用するためにはAPIキーが必要です。まだお持ちでない方は、OpenAIの公式サイトからアカウントを作成し、APIキーを取得してください。
1. OpenAIのサイトにアクセス: https://openai.com/ にアクセスし、ログインまたは新規登録を行います。
2. APIキーの生成: ログイン後、アカウント設定画面から「API keys」セクションに進み、「Create new secret key」ボタンをクリックしてAPIキーを生成します。
3. APIキーの保管: 生成されたAPIキーは非常に重要です。絶対に他人に知られないように、安全な場所に保管してください。 GASのスクリプト内に直接書き込むのはセキュリティ上推奨されません。後ほど、GASのスクリプトプロパティを利用した安全な保管方法を解説します。
GASスクリプトの作成:基本の流れ
GASからChatGPT APIを呼び出す基本的な流れは以下のようになります。
1. APIエンドポイントの設定: OpenAIが提供するAPIのエンドポイント(URL)を指定します。
2. リクエストヘッダーの設定: APIキーなどの認証情報を含めます。
3. リクエストボディの設定: ChatGPTに送信するプロンプト(指示文)やモデル名などを指定します。
4. UrlFetchAppによるHTTPリクエスト送信: GASの標準機能であるUrlFetchAppを使ってAPIにリクエストを送信します。
5. レスポンスの取得と解析: APIからの応答を受け取り、必要な情報を抽出します。
実践:GASでChatGPTに質問してみよう!
まずは、簡単な例として、GASからChatGPTに「今日の天気は?」と質問し、その回答を表示するスクリプトを作成してみましょう。
1. GASエディタの起動
GASプロジェクトを作成するには、Googleドライブから「新規」>「その他」>「Google Apps Script」を選択します。もしくは、既存のGoogleドキュメント、スプレッドシート、フォームなどから「拡張機能」>「Apps Script」を選択しても起動できます。
2. APIキーの安全な保管(スクリプトプロパティ)
APIキーはスクリプト内に直接書くのではなく、スクリプトプロパティに保存するのが安全です。
1. GASエディタの左側メニューにある「プロジェクトの設定」アイコン(歯車マーク)をクリックします。
2. 「スクリプトのプロパティ」セクションで、「プロパティを追加」をクリックします。
3. 「プロパティ名」に OPENAI_API_KEY、「値」に取得したAPIキーを入力します。
4. 「保存」をクリックします。
3. コードの記述
以下のコードをGASエディタに貼り付け、function doGet() の部分を必要に応じて変更してください。
function askChatGPT() {
const apiKey = PropertiesService.getScriptProperties().getProperty('OPENAI_API_KEY');
if (!apiKey) {
throw new Error('APIキーが設定されていません。スクリプトプロパティにOPENAI_API_KEYを設定してください。');
}
const apiUrl = 'https://api.openai.com/v1/chat/completions'; // Chat Completions API のエンドポイント
const model = 'gpt-3.5-turbo'; // 使用するモデル
const prompt = '今日の天気は?'; // ChatGPTに送る質問
const options = {
'method' : 'post',
'contentType': 'application/json',
'headers': {
'Authorization': 'Bearer ' + apiKey
},
'payload' : JSON.stringify({
'model': model,
'messages': [
{'role': 'system', 'content': 'You are a helpful assistant.'},
{'role': 'user', 'content': prompt}
],
'max_tokens': 150 // 生成される最大トークン数(回答の長さを調整)
})
};
try {
const response = UrlFetchApp.fetch(apiUrl, options);
const jsonResponse = JSON.parse(response.getContentText());
if (jsonResponse.choices && jsonResponse.choices.length > 0) {
const message = jsonResponse.choices[0].message.content;
Logger.log('ChatGPTからの応答: ' + message);
return message;
} else {
Logger.log('エラー: 応答に期待されるデータが含まれていません。');
Logger.log(jsonResponse);
return 'ChatGPTからの応答を取得できませんでした。';
}
} catch (e) {
Logger.log('エラーが発生しました: ' + e.toString());
return 'エラーが発生しました: ' + e.toString();
}
}
// テスト実行用の関数(必要に応じて)
function testAskChatGPT() {
const result = askChatGPT();
SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange('A1').setValue(result);
}
コードの解説:
PropertiesService.getScriptProperties().getProperty('OPENAI_API_KEY')で、スクリプトプロパティに保存したAPIキーを取得しています。apiUrlには、ChatGPTのチャット補完APIのエンドポイントを指定します。現在はhttps://api.openai.com/v1/chat/completionsが主流です。modelには、利用したいChatGPTのモデルを指定します。gpt-3.5-turboはコストパフォーマンスに優れており、多くの用途で利用できます。messages配列には、AIとの対話履歴を渡します。roleにはsystem(AIの役割設定)、user(ユーザーからの質問)、assistant(AIからの返答)などを指定します。今回の例では、システムメッセージとユーザーメッセージのみを渡しています。max_tokensは、生成される回答の最大長を制限します。必要に応じて調整してください。UrlFetchApp.fetch(apiUrl, options)でAPIにリクエストを送信し、JSON.parse(response.getContentText())でJSON形式の応答をJavaScriptオブジェクトに変換しています。jsonResponse.choices[0].message.contentで、ChatGPTからの回答本文を取得しています。
4. 実行と確認
1. GASエディタの上部にある関数選択ドロップダウンで askChatGPT を選択し、実行ボタン(▶︎)をクリックします。
2. 初回実行時には、スクリプトに必要権限の承認を求められますので、内容を確認して承認してください。
3. 実行後、GASエディタ下部にある「実行ログ」で、ChatGPTからの応答を確認できます。
4. testAskChatGPT 関数をコメントアウトせずに実行した場合、アクティブなスプレッドシートのA1セルに結果が表示されます。
より実践的な活用例
1. Gmailの自動返信
function autoReplyGmail() {
const threads = GmailApp.search('is:unread in:inbox'); // 未読メールを検索
threads.forEach(thread => {
const messages = thread.getMessages();
const latestMessage = messages[messages.length - 1];
const subject = latestMessage.getSubject();
const body = latestMessage.getPlainBody();
// ChatGPTにメール内容の要約や返信案の作成を依頼
const replySuggestion = askChatGPTForReply('Subject: ' + subject + '\n\n' + body);
// 返信メールを作成(ここでは仮の処理)
// GmailApp.sendEmail(latestMessage.getFrom(), 'Re: ' + subject, replySuggestion);
thread.markRead(); // 既読にする
Logger.log('処理完了: ' + subject);
});
}
function askChatGPTForReply(emailContent) {
const apiKey = PropertiesService.getScriptProperties().getProperty('OPENAI_API_KEY');
const apiUrl = 'https://api.openai.com/v1/chat/completions';
const model = 'gpt-3.5-turbo';
const prompt = '以下のメール内容を理解し、丁寧な返信を作成してください。返信は簡潔にまとめてください。\n\n' + emailContent;
const options = {
'method' : 'post',
'contentType': 'application/json',
'headers': {
'Authorization': 'Bearer ' + apiKey
},
'payload' : JSON.stringify({
'model': model,
'messages': [
{'role': 'system', 'content': 'あなたはプロフェッショナルなアシスタントです。'},
{'role': 'user', 'content': prompt}
],
'max_tokens': 300
})
};
try {
const response = UrlFetchApp.fetch(apiUrl, options);
const jsonResponse = JSON.parse(response.getContentText());
return jsonResponse.choices[0].message.content;
} catch (e) {
Logger.log('メール返信生成エラー: ' + e.toString());
return '返信を作成できませんでした。';
}
}
この例では、未読メールを取得し、その内容をChatGPTに渡して返信案を生成しています。実際の送信処理はコメントアウトしていますので、テストしてから uncomment してください。
2. スプレッドシートでの文章生成
スプレッドシートに商品名や特徴を入力しておき、ChatGPTに商品説明文を生成させることも可能です。
function generateProductDescription() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const range = sheet.getDataRange();
const values = range.getValues();
// ヘッダー行をスキップして、2行目から処理を開始
for (let i = 1; i < values.length; i++) {
const productName = values[i][0]; // A列に商品名
const features = values[i][1]; // B列に特徴
if (productName) { // 商品名がある場合のみ処理
const description = generateDescriptionWithChatGPT(productName, features);
sheet.getRange(i + 1, 3).setValue(description); // C列に商品説明文を出力
Utilities.sleep(1000); // APIレート制限回避のため、1秒待機
}
}
}
function generateDescriptionWithChatGPT(productName, features) {
const apiKey = PropertiesService.getScriptProperties().getProperty('OPENAI_API_KEY');
const apiUrl = 'https://api.openai.com/v1/chat/completions';
const model = 'gpt-3.5-turbo';
const prompt = `以下の商品について、魅力的な商品説明文を作成してください。\n\n商品名: ${productName}\n特徴: ${features}\n\n商品説明:`;
const options = {
'method' : 'post',
'contentType': 'application/json',
'headers': {
'Authorization': 'Bearer ' + apiKey
},
'payload' : JSON.stringify({
'model': model,
'messages': [
{'role': 'system', 'content': 'あなたは経験豊富なマーケターです。'},
{'role': 'user', 'content': prompt}
],
'max_tokens': 200
})
};
try {
const response = UrlFetchApp.fetch(apiUrl, options);
const jsonResponse = JSON.parse(response.getContentText());
return jsonResponse.choices[0].message.content;
} catch (e) {
Logger.log('商品説明生成エラー: ' + e.toString());
return '商品説明を作成できませんでした。';
}
}
このスクリプトは、アクティブなスプレッドシートのA列に商品名、B列に特徴が入力されていることを想定しています。C列に生成された商品説明文が出力されます。Utilities.sleep(1000); は、APIの利用制限に引っかからないように、リクエスト間に1秒間の待機を入れています。
まとめ
いかがでしたでしょうか?GASとChatGPT APIを連携させることで、これまで手作業で行っていた多くのタスクを自動化し、業務効率を大幅に向上させることが可能です。
最初は簡単なスクリプトから始め、徐々に複雑な処理に挑戦していくことをお勧めします。APIの利用には料金が発生する場合があるので、OpenAIの料金体系も確認しておきましょう。
もし、さらに詳しい解説や、特定の業務に特化した連携方法について知りたい場合は、ぜひコメントで教えてください!
次回もお楽しみに!
GAS自動化の導入相談
請求書PDF作成、Gmail自動送信、Slack通知、スプレッドシート連携などを業務に合わせて実装できます。