【業務改善】Googleカレンダーの予定をChatWorkに自動送信するGoogle Apps Scriptの作り方【withAI】

みなさまこんにちは。今回は今までの知識(ChatGPT、Gemini)を使って今までの応用した自動化を紹介します💪
全体像としては「Googleカレンダーの予定を取得→Geminiに予定の内容を投げる→ChatWorkに予定の一覧と応援メッセージが送られる」という感じになっています。

それでは早速完成したコードです。Google AppsScriptで実行できます。カレンダーIDと表示させる名前、APIなどはご自身の取得したものを入れてください。

function sendEventsToChatworkAI() {
  // 4つのカレンダーIDと名前のマッピング
  var calendars = {
    'samplea@sample.com': 'サンプルA',
    'sampleb@sample.com': 'サンプルB',
    'samplec@sample.com': 'サンプルC',
    'sampled@sample.com': 'サンプルD'
  };
  
  var chatworkToken = 'xxxxxxxxxxxxxxxxxxxxxx'; // チャットワークAPIトークン
  var roomId = '000000000'; // チャットワークのルームID

  Object.keys(calendars).forEach(function(calendarId) {
    var today = new Date();
    var events = CalendarApp.getCalendarById(calendarId).getEventsForDay(today);

    var message = '[info][title]' + calendars[calendarId] + 'の本日の予定[/title]';
    for (var i = 0; i < events.length; i++) {
      var event = events[i];
      message += '- ' + event.getTitle() + ' (' + formatTime(event.getStartTime()) + ')\n';
    }

    // 予定がある場合のみGemini AIを呼び出して応援メッセージを生成
    if (events.length > 0) {
      var encouragement = getEncouragementFromGemini(events);
      message += encouragement ? '\n' + encouragement : '';
    } else {
      message += '予定はありません。';
    }

    message += '[/info]';

    sendToChatworkAI(roomId, message, chatworkToken); 
  });
}




function getEncouragementFromGemini(events) {
  var apiKey = 'xxxxxxxxxxxxxxxxxxxxxxxxxx'; // Gemini APIキーを設定
  var apiUrl = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent';

  var eventTitles = events.map(function(event) { return event.getTitle(); }).join(', ');
  var prompt = '今日の予定に基づいて松岡修造として応援メッセージを一言で: ' + eventTitles;

  var payload = {
    contents: [{
      parts: [{ text: prompt }]
    }]
  };

  var options = {
    'method' : 'post',
    'contentType': 'application/json',
    'payload' : JSON.stringify(payload),
    'muteHttpExceptions': true
  };

  try {
    var response = UrlFetchApp.fetch(apiUrl + '?key=' + apiKey, options);
    var content = JSON.parse(response.getContentText());
    return content.candidates && content.candidates[0] ? content.candidates[0].content.parts[0].text : '';
  } catch (error) {
    Logger.log(error.toString());
    return '';
  }
}

function sendToChatworkAI(roomId, message, token) {
  var payload = {
    'body': message
  };

  var options = {
    'method' : 'post',
    'headers': {
      'X-ChatWorkToken': token
    },
    'payload' : payload
  };

  var url = 'https://api.chatwork.com/v2/rooms/' + roomId + '/messages';
  UrlFetchApp.fetch(url, options);
}

function formatTime(time) {
  return Utilities.formatDate(time, Session.getScriptTimeZone(), 'HH:mm');
}

最終的な出力はこんな感じです。カレンダーIDごとに名前をマッピングして、各人に対して予定を通知します。
予定内容をもとにGeminiが思う松岡修造風な応援メッセージが書かれる使用です。ほとんど読まれることはないのでこの機能は削除してもいいと思います\(^o^)/
削除するときは上記のコードをChatGPTにそのまま貼り付けて、Geminiの挙動を消してコードを書き直してなどと言えば消してくれるでしょう。

目次

はじめに

業務改善の経緯

今回の経緯ですが少し前の記事でGoogleカレンダーの予定をスプレッドシートに書き込むGASを紹介しました。
そのスプレッドシートをLookerStudioに接続することで業務内容と時間の見える化はだいぶできるようになっていました。なっていたんですが、、、

「ふつーにアシスタント全員の予定が朝ChatWorkに流れてきて欲しいっす」

どシンプル!!
まあ一週間の予定は見える化できましたけど、その日の予定はカレンダー開かないと見えませんしね。あとGoogleカレンダーの表示に社内の人入れすぎるとシンプルに見ずらいですし😥

全体像

流れ

GAS(カレンダー取得)→Googleカレンダー→GAS(取得したカレンダー情報をGeminiに渡す)→Gemini→GAS(Geminiから返ってきた値とカレンダーの情報をあわせるてメッセージをChatWorkに渡す)→ChatWork

用意するもの

  • Googleカレンダー・・・大さじ4(そもそも登録されてることが前提)
  • ChatWork・・・輪切り(APIトークンとルームIDを調べましょう)
  • Google AppsScript・・・包丁(使い方ミスらないように注意しましょう)
  • Gemini・・・小さじ少々(ちょとだけ遊び心で入れます)
  • ChatGPT・・・鍋(ここに材料全部ぶちこむと完成します)

基本的にはGASで実装します。
Googleカレンダーから任意のカレンダーの予定を取得してChatWorkにインフォメーションとして渡すのが依頼内容のメインです。
だがしかしButわたしはも少し遊びほしい\(^o^)/
ので、これまた前回の記事で紹介しましたGeminiを取り入れてみようと思います💪

せっかくならカレンダーの予定を伝えるときに、今日一日頑張れるような言葉がほしい!
しかも定型文ではなくランダムに生成させたい!となったらAIでしょ!(ほかにも方法はあるのかも。。。詳しい人教えてください)

ChatGPTといっしょに実装

ChatGPTとの仕事の仕方について

実装の前にChatGPTと仕事するときに個人的に気をつけている点を少し紹介します。これですべてうまく行くわけではないので、ネタとして読んでもらえれば😆

  1. 検索するように使わない
    ChatGPTを使い始めたときにありがちですが、つい検索するような指示しちゃいますよね。いままでのネットでの調べ物は「ChatGPT 使い方」みたいな書き方でしたがGPTにはあまり有効じゃなさそうです。そもそもGPTは連想ゲームのように言葉のつながりを意識して文章を生成しているようなので、正確な情報を出すのには向いていない気がします。
    それよりも「ChatGPTを初めて使うんだけどどんなふうに使えるの?具体的な使用例を3ジャンルくらいに分けてそれぞれ3つずつ使い方を紹介して」みたいな方が望んだ結果が出てきやすいです。
  2. 頭に浮かんだ言葉、文字はすべて入力する
    実際に上記の文章をGPTに入れてみると結果が大きく変わっているかと思います。
    ChatGPTに与える情報は多ければ良いとは言えませんが、ユーザーの背景情報があったほうがGPTがユーザーのニーズを汲み取って書いてくれます。
    きれいな文章で入力しようとするより、雑でも良いから頭の中で考えていることを全部伝えたほうが訂正もしやすく、はやく希望した出力を出してもらえますよ!
  3. 手を動かしながら何度もコミュニケーションをとる
    コードを書いてもらう場合だけかもしれませんが、最終的には手を動かして間違えを修正していくしか無いです。GASは書き方が間違えていればエラーメッセージを書いてくれるので、いち早く間違えて、早く修正するのが一番いいです💪
    あとは根気よくChatGPTとコミュニケーションをとりましょう!一回ではエラー内容が治らないこともありますが、こちらからもここが原因じゃない?とフィードバックを返してあげるとより修正がスムーズです。脳死でエラーメッセージ貼り付けでもできないことは無いですが、自身の成長のためにも自分の考えをGPTに返してみましょ😆

ChatWorkにカレンダーの予定を投稿するまで

ここからいつも通りの音声入力です。誤字脱字などはあまり気にしないでください😆

GoogleAppsScriptのコードが入ってくださいこのコードはGoogleカレンダーのIDを指定した当日の予定を取得してこれをチャットワークに送ります今一旦大雑把でいいんでコード書いてみてください

Google Apps Scriptを使用して、Googleカレンダーの予定を取得し、チャットワークに送信する基本的なコードは以下のようになります。

function sendEventsToChatwork() {
var calendarId = ‘your_calendar_id_here’; // Google カレンダーIDを設定
var chatworkToken = ‘your_chatwork_api_token_here’; // チャットワークAPIトークンを設定
var roomId = ‘your_chatwork_room_id_here’; // チャットワークのルームIDを設定
var today = new Date();
var events = CalendarApp.getCalendarById(calendarId).getEventsForDay(today);
var message = ‘本日の予定:\n’;
for (var i = 0; i < events.length; i++) {
var event = events[i];
message += ‘- ‘ + event.getTitle() + ‘ (‘ + event.getStartTime() + ‘)\n’;
}
if (events.length == 0) {
message += ‘予定はありません。’;
}
sendToChatwork(roomId, message, chatworkToken);
}
function sendToChatwork(roomId, message, token) {
var payload = {
‘body’: message
};
var options = {
‘method’ : ‘post’,
‘headers’: {
‘X-ChatWorkToken’: token
},
‘payload’ : payload
};
var url = ‘https://api.chatwork.com/v2/rooms/’ + roomId + ‘/messages’;
UrlFetchApp.fetch(url, options);
}

このコードは次のステップを実行します:
Google カレンダーから当日の予定を取得します。
取得した予定をメッセージ形式で整形します。
チャットワークAPIを利用して、特定のチャットルームにこのメッセージを送信します。
このコードを使用する前に、your_calendar_id_here, your_chatwork_api_token_here, your_chatwork_room_id_hereを適切な値に置き換えてください。また、Google Apps ScriptのプロジェクトでチャットワークAPIの利用を許可する必要があります。

なんか最近のGPTは素直にシンプルな結果を書いてくれてる気がする(^o^)
カスタムインストラクションを入れたからなのか、単純なアップデートなのかは謎。。。

カレンダーのIDが複数あるんでそれに対応するようにあとチャットワークにはそのカレンダーのIDごとにメッセージ送りたいです

複数のカレンダーIDに対応し、それぞれのカレンダーごとにチャットワークにメッセージを送信するようにスクリプトを修正します。

function sendEventsToChatwork() {
  var calendarIds = ['calendar_id_1', 'calendar_id_2']; // 複数のカレンダーIDを配列に設定
  var chatworkToken = 'your_chatwork_api_token_here'; // チャットワークAPIトークンを設定
  var roomId = 'your_chatwork_room_id_here'; // チャットワークのルームIDを設定

  calendarIds.forEach(function(calendarId) {
    var today = new Date();
    var events = CalendarApp.getCalendarById(calendarId).getEventsForDay(today);

    var message = 'カレンダーID ' + calendarId + ' の本日の予定:\n';
    for (var i = 0; i < events.length; i++) {
      var event = events[i];
      message += '- ' + event.getTitle() + ' (' + formatTime(event.getStartTime()) + ')\n';
    }

    if (events.length == 0) {
      message += '予定はありません。';
    }

    sendToChatwork(roomId, message, chatworkToken);
  });
}

function sendToChatwork(roomId, message, token) {
  var payload = {
    'body': message
  };

  var options = {
    'method' : 'post',
    'headers': {
      'X-ChatWorkToken': token
    },
    'payload' : payload
  };

  var url = 'https://api.chatwork.com/v2/rooms/' + roomId + '/messages';
  UrlFetchApp.fetch(url, options);
}

function formatTime(time) {
  return Utilities.formatDate(time, Session.getScriptTimeZone(), 'HH:mm');
}

このスクリプトでは、以下の手順を踏んでいます:
複数のカレンダーIDを配列に設定します。
各カレンダーの今日の予定を取得し、整形します。
各カレンダーごとの予定の概要をチャットワークに送信します。
カレンダーIDやチャットワークのトークン、ルームIDは適宜置き換えてください。また、予定の開始時間をフォーマットするためにformatTime関数を追加しています。

ぶっちゃけこのままでも動きます。しかし、もっと見やすく、面白くしたくなるのでもう少し修正します。せっかくGeminiを利用できるなら利用してみたいですしね、なんならそのために作ってるまである💪

このコードいい感じに動いてますただ修正して欲しいのがカレンダーIDに対して名前を入れたいんだけどその対応関係を作るのをコードの中に盛り込んで修正してほしい

カレンダーIDと名前の対応関係をコード内で管理するように修正します。以下のコードでは、カレンダーIDと名前をマッピングするオブジェクトを使用しています。

function sendEventsToChatwork() {
  // カレンダーIDと名前のマッピング
  var calendars = {
    'calendar_id_1': 'カレンダー1の名前',
    'calendar_id_2': 'カレンダー2の名前'
    // 他のカレンダーIDと名前を追加できます
  };
  
  var chatworkToken = 'your_chatwork_api_token_here'; // チャットワークAPIトークン
  var roomId = 'your_chatwork_room_id_here'; // チャットワークのルームID

  Object.keys(calendars).forEach(function(calendarId) {
    var today = new Date();
    var events = CalendarApp.getCalendarById(calendarId).getEventsForDay(today);

    var message = calendars[calendarId] + 'の本日の予定:\n';
    for (var i = 0; i < events.length; i++) {
      var event = events[i];
      message += '- ' + event.getTitle() + ' (' + formatTime(event.getStartTime()) + ')\n';
    }

    if (events.length == 0) {
      message += '予定はありません。';
    }

    sendToChatwork(roomId, message, chatworkToken);
  });
}

function sendToChatwork(roomId, message, token) {
  var payload = {
    'body': message
  };

  var options = {
    'method' : 'post',
    'headers': {
      'X-ChatWorkToken': token
    },
    'payload' : payload
  };

  var url = 'https://api.chatwork.com/v2/rooms/' + roomId + '/messages';
  UrlFetchApp.fetch(url, options);
}

function formatTime(time) {
  return Utilities.formatDate(time, Session.getScriptTimeZone(), 'HH:mm');
}

このコードでは、calendarsオブジェクトを介してカレンダーIDとその名前を関連付けています。各カレンダーIDの名前は、メッセージに含まれ、各カレンダーの予定を区別して表示します。必要に応じてカレンダーIDと名前のペアをcalendarsオブジェクトに追加してください。

ここでカレンダーID3つ目を手入力で書いたら何故かエラーが、、、

マッピングするカレンダーの数が4つあるんですけど4つにしたらエラー入ってます修正してください

カレンダーのマッピングが4つある場合に対応するように修正します。エラーの原因を特定するために、マッピングの構造と具体的なエラーメッセージを確認し、それに基づいてコードを修正します。
以下のコードは4つのカレンダーIDとそれぞれの名前をマッピングする例です。このコードを参考にして、エラーが発生した箇所を特定し、修正してください。

function sendEventsToChatwork() {
  // 4つのカレンダーIDと名前のマッピング
  var calendars = {
    'calendar_id_1': 'カレンダー1の名前',
    'calendar_id_2': 'カレンダー2の名前',
    'calendar_id_3': 'カレンダー3の名前',
    'calendar_id_4': 'カレンダー4の名前'
  };
  
  var chatworkToken = 'your_chatwork_api_token_here'; // チャットワークAPIトークン
  var roomId = 'your_chatwork_room_id_here'; // チャットワークのルームID

  Object.keys(calendars).forEach(function(calendarId) {
    var today = new Date();
    var events = CalendarApp.getCalendarById(calendarId).getEventsForDay(today);

    var message = calendars[calendarId] + 'の本日の予定:\n';
    for (var i = 0; i < events.length; i++) {
      var event = events[i];
      message += '- ' + event.getTitle() + ' (' + formatTime(event.getStartTime()) + ')\n';
    }

    if (events.length == 0) {
      message += '予定はありません。';
    }

    sendToChatwork(roomId, message, chatworkToken);
  });
}

function sendToChatwork(roomId, message, token) {
  var payload = {
    'body': message
  };

  var options = {
    'method' : 'post',
    'headers': {
      'X-ChatWorkToken': token
    },
    'payload' : payload
  };

  var url = 'https://api.chatwork.com/v2/rooms/' + roomId + '/messages';
  UrlFetchApp.fetch(url, options);
}

function formatTime(time) {
  return Utilities.formatDate(time, Session.getScriptTimeZone(), 'HH:mm');
}

このコードは、4つのカレンダーIDとそれぞれの名前を含むマッピングを処理するように設計されています。もし依然としてエラーが発生する場合、エラーメッセージの詳細を提供していただければ、より具体的な修正を行うことができます。また、カレンダーIDやAPIトークンなどの値が正しいことを確認してください。

GPTに書いてもらうとなぜか消えるエラー。。。バッククオートとか全角半角の問題だったのかな???とりあえず動くので進めます!

OkOk完璧このコード最高
ただメッセージをインフォメーション形式で送りたいんだでタイトルは今書いてもらってる本日の予定っていうところまでをタイトルにしてその下の予定をインフォメーションの本文にしたい連絡ためメッセージ記号を書いておくので参考にして行動確認をしてください
[info][title]…[/title]…[/info]

ChatWorkの記法は知らない可能性あったので念のためサンプルをつけて指示しました。GPTが知らなそうなことはサンプルくっつけて指示してあげるとだいぶ精度上げてくれます👀

あとGPTの出力に対してフィードバックしてあげるの大切です!出力が要望にあってるのか、間違ってるのかをGPTにちゃんと伝えてあげないと「そうじゃないんだよなぁ」って結果返してきます。

了解しました。メッセージをチャットワークのインフォメーション形式で送信するようにコードを修正します。メッセージのタイトル部分に「本日の予定」とし、その下に予定の詳細を記載します。以下が修正後のコードです。

function sendEventsToChatwork() {
  var calendars = {
    'calendar_id_1': 'カレンダー1の名前',
    'calendar_id_2': 'カレンダー2の名前',
    'calendar_id_3': 'カレンダー3の名前',
    'calendar_id_4': 'カレンダー4の名前'
  };
  
  var chatworkToken = 'your_chatwork_api_token_here'; // チャットワークAPIトークン
  var roomId = 'your_chatwork_room_id_here'; // チャットワークのルームID

  Object.keys(calendars).forEach(function(calendarId) {
    var today = new Date();
    var events = CalendarApp.getCalendarById(calendarId).getEventsForDay(today);

    var message = '[info][title]' + calendars[calendarId] + 'の本日の予定:[/title]';
    for (var i = 0; i < events.length; i++) {
      var event = events[i];
      message += '- ' + event.getTitle() + ' (' + formatTime(event.getStartTime()) + ')\n';
    }

    if (events.length == 0) {
      message += '予定はありません。';
    }

    message += '[/info]';

    sendToChatwork(roomId, message, chatworkToken);
  });
}

function sendToChatwork(roomId, message, token) {
  var payload = {
    'body': message
  };

  var options = {
    'method' : 'post',
    'headers': {
      'X-ChatWorkToken': token
    },
    'payload' : payload
  };

  var url = 'https://api.chatwork.com/v2/rooms/' + roomId + '/messages';
  UrlFetchApp.fetch(url, options);
}

function formatTime(time) {
  return Utilities.formatDate(time, Session.getScriptTimeZone(), 'HH:mm');
}

このコードでは、各カレンダーの予定をインフォメーション形式([info][title]…[/title]…[/info])でメッセージに整形しています。タイトル部分にはカレンダーの名前と「本日の予定」を表示し、その下に予定の詳細を列挙しています。予定がない場合は「予定はありません」と表示します。

こんな感じでいったんのコードはこれで完成しました。あとはGASのトリガーを好きなタイミングに設定してあげるだけで、任意のタイミングにGoogleカレンダーの予定をChatWorkにインフォメーションとして投稿してくれます。(GASのトリガーだとそこまで正確な時間指定はできません。たぶん1時間の間のどこかで実行くらい。もっと正確なタイミングはコード側で指定するとできたと思います。)

Geminiを使って松岡修造人格を召喚し、熱血応援メッセージを送る

基本的な通知は前の段落で完了してるのでここからは遊び心部分です。この記事を書いている段階ではGeminiAPIに利用料金がかかっていませんが、今後料金が発生する場合もありますので注意してください。

ここで実装するのは朝イチの低いテンションをぶちあげる松岡修造風な応援メッセージを盛り込むことです。

早速Gemini Script Assistantを起動して上で書いたコードと指示を送ります。

以下のGoogleAppsScriptのコードの中にジェミニを組み込みたいと思いますこのコードはGoogleカレンダーの予定を取得して1日の予定を特定のチャットワークにインフォメーションとして投稿するようにセットされてますイメージとしてはインフォメーションのタイトルに書くカレンダーのアカウントから名前をとって誰々の本日の予定というタイトルがついてその下に本文としてカレンダーから取得した予定の名前を一覧で表示させてますこのカレンダーから取得したい予定を見てジェミニには見た人がポジティブになるような応援メッセージを一言だけ書いて欲しいですこの応援メッセージはなるべく一言で終わらせるようにしてくださいあまり長いやつだと見ないからねそれではコードを渡すよ

コード
”’
function sendEventsToChatwork() {
var calendars = {
‘calendar_id_1’: ‘カレンダー1の名前’,
‘calendar_id_2’: ‘カレンダー2の名前’,
‘calendar_id_3’: ‘カレンダー3の名前’,
‘calendar_id_4’: ‘カレンダー4の名前’
};
var chatworkToken = ‘your_chatwork_api_token_here’; // チャットワークAPIトークン
var roomId = ‘your_chatwork_room_id_here’; // チャットワークのルームID
Object.keys(calendars).forEach(function(calendarId) {
var today = new Date();
var events = CalendarApp.getCalendarById(calendarId).getEventsForDay(today);
var message = ‘[info][title]’ + calendars[calendarId] + ‘の本日の予定:[/title]’; for (var i = 0; i < events.length; i++) { var event = events[i]; message += ‘- ‘ + event.getTitle() + ‘ (‘ + formatTime(event.getStartTime()) + ‘)\n’; } if (events.length == 0) { message += ‘予定はありません。’; } message += ‘[/info]’; sendToChatwork(roomId, message, chatworkToken);
});
}
function sendToChatwork(roomId, message, token) {
var payload = {
‘body’: message
};
var options = {
‘method’ : ‘post’,
‘headers’: {
‘X-ChatWorkToken’: token
},
‘payload’ : payload
};
var url = ‘https://api.chatwork.com/v2/rooms/’ + roomId + ‘/messages’;
UrlFetchApp.fetch(url, options);
}
function formatTime(time) {
return Utilities.formatDate(time, Session.getScriptTimeZone(), ‘HH:mm’);
}
”’

指定されたGoogle Apps ScriptにGemini AIを組み込んで、カレンダーイベントに基づくポジティブな応援メッセージを生成する機能を追加します。この機能を追加するには、以下の手順を踏む必要があります:
Gemini APIの呼び出しを行う関数を定義します。
その関数をsendEventsToChatwork関数内で呼び出し、イベントのリストをGemini AIに渡して応援メッセージを生成します。
生成されたメッセージをチャットワークに投稿するメッセージに組み込みます。
以下に、これらの変更を行ったコードの例を示します:

function sendEventsToChatwork() {
  // 4つのカレンダーIDと名前のマッピング
var calendars = {
'calendar_id_1': 'カレンダー1の名前',
'calendar_id_2': 'カレンダー2の名前',
'calendar_id_3': 'カレンダー3の名前',
'calendar_id_4': 'カレンダー4の名前'
};

  var chatworkToken = 'xxxxxxxxxxxxxxxxxxxxxxxxxx'; // チャットワークAPIトークン
  var roomId = '000000'; // チャットワークのルームID

  Object.keys(calendars).forEach(function(calendarId) {
    var today = new Date();
    var events = CalendarApp.getCalendarById(calendarId).getEventsForDay(today);

    var message = '[info][title]' + calendars[calendarId] + 'の本日の予定(flex)[/title]';
    for (var i = 0; i < events.length; i++) {
      var event = events[i];
      message += '- ' + event.getTitle() + ' (' + formatTime(event.getStartTime()) + ')\n';
    }

    // Gemini AIを呼び出して応援メッセージを生成
    var encouragement = getEncouragementFromGemini(events);
    message += encouragement ? '\n' + encouragement : '';

    if (events.length == 0) {
      message += '予定はありません。';
    }

    message += '[/info]';

    sendToChatwork(roomId, message, chatworkToken);
  });
}

function getEncouragementFromGemini(events) {
  var apiKey = 'your_gemini_api_key'; // Gemini APIキーを設定
  var apiUrl = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent';

  var eventTitles = events.map(function(event) { return event.getTitle(); }).join(', ');
  var prompt = '今日の予定に基づいてポジティブな応援メッセージを一言で: ' + eventTitles;

  var payload = {
    contents: [{
      parts: [{ text: prompt }]
    }]
  };

  var options = {
    'method' : 'post',
    'contentType': 'application/json',
    'payload' : JSON.stringify(payload),
    'muteHttpExceptions': true
  };

  try {
    var response = UrlFetchApp.fetch(apiUrl + '?key=' + apiKey, options);
    var content = JSON.parse(response.getContentText());
    return content.candidates && content.candidates[0] ? content.candidates[0].content.parts[0].text : '';
  } catch (error) {
    Logger.log(error.toString());
    return '';
  }
}

// 他の関数は変更なし

このコードでは、getEncouragementFromGemini関数がGemini AI APIにリクエストを送り、イベントのタイトルを基にポジティブな応援メッセージを生成します。生成されたメッセージはsendEventsToChatwork関数でチャットワークに投稿されるメッセージに追加されます。
注意:Gemini APIを使用するには、有効なAPIキーが必要です。上記のyour_gemini_api_keyの部分を適切なAPIキーに置き換えてください。また、APIの呼び出し制限や応答時間に注意してください。

コードが省略されてしまったので、最後まで書いてもらいます。これもフィードバックですね、要望と違う動きをしていたらちゃんと指示をして修正してもらいましょう!

コードは省略することなく全て書き切って欲しい頼みますよお願いしますね

了解しました。指定されたGoogle Apps ScriptにGemini AIを組み込んだ完全なコードを以下に示します。このコードは、Googleカレンダーから今日の予定を取得し、それに基づいてGemini AIを使ってポジティブな応援メッセージを生成し、最後にそのメッセージを特定のチャットワークルームに投稿します。

function sendEventsToChatwork() {
  // 4つのカレンダーIDと名前のマッピング
var calendars = {
'calendar_id_1': 'カレンダー1の名前',
'calendar_id_2': 'カレンダー2の名前',
'calendar_id_3': 'カレンダー3の名前',
'calendar_id_4': 'カレンダー4の名前'
};
  
  var chatworkToken = 'xxxxxxxxxxxxxxxxxx'; // チャットワークAPIトークン
  var roomId = '000000'; // チャットワークのルームID

  Object.keys(calendars).forEach(function(calendarId) {
    var today = new Date();
    var events = CalendarApp.getCalendarById(calendarId).getEventsForDay(today);

    var message = '[info][title]' + calendars[calendarId] + 'の本日の予定[/title]';
    for (var i = 0; i < events.length; i++) {
      var event = events[i];
      message += '- ' + event.getTitle() + ' (' + formatTime(event.getStartTime()) + ')\n';
    }

    // Gemini AIを呼び出して応援メッセージを生成
    var encouragement = getEncouragementFromGemini(events);
    message += encouragement ? '\n' + encouragement : '';

    if (events.length == 0) {
      message += '予定はありません。';
    }

    message += '[/info]';

    sendToChatwork(roomId, message, chatworkToken);
  });
}

function getEncouragementFromGemini(events) {
  var apiKey = 'your_gemini_api_key'; // Gemini APIキーを設定
  var apiUrl = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent';

  var eventTitles = events.map(function(event) { return event.getTitle(); }).join(', ');
  var prompt = '今日の予定に基づいてポジティブな応援メッセージを一言で: ' + eventTitles;

  var payload = {
    contents: [{
      parts: [{ text: prompt }]
    }]
  };

  var options = {
    'method' : 'post',
    'contentType': 'application/json',
    'payload' : JSON.stringify(payload),
    'muteHttpExceptions': true
  };

  try {
    var response = UrlFetchApp.fetch(apiUrl + '?key=' + apiKey, options);
    var content = JSON.parse(response.getContentText());
    return content.candidates && content.candidates[0] ? content.candidates[0].content.parts[0].text : '';
  } catch (error) {
    Logger.log(error.toString());
    return '';
  }
}

function sendToChatwork(roomId, message, token) {
  var payload = {
    'body': message
  };

  var options = {
    'method' : 'post',
    'headers': {
      'X-ChatWorkToken': token
    },
    'payload' : payload
  };

  var url = 'https://api.chatwork.com/v2/rooms/' + roomId + '/messages';
  UrlFetchApp.fetch(url, options);
}

function formatTime(time) {
  return Utilities.formatDate(time, Session.getScriptTimeZone(), 'HH:mm');
}

このコードには、次のような処理が含まれています:
sendEventsToChatwork関数は、各カレンダーから今日のイベントを取得し、それらをメッセージに追加します。
getEncouragementFromGemini関数は、これらのイベントを基にGemini AIを呼び出して応援メッセージを生成します。
生成されたメッセージは、チャットワークの指定されたルームに投稿されます。
注意点として、your_gemini_api_keyには有効なGemini APIキーを設定する必要があります。また、APIの呼び出しにはインターネットアクセスが必要ですので、Google Apps Scriptの設定で適切な権限を付与する必要があります。

実際に動かしてみると予定がない場合も「休むことも仕事のうち」みたいな応援メッセージを書いてくれます。
佐山聡の「精神的なこと、これも技術のうち」みたいで好きではありますが、無駄にメッセージが長くなるので消します💪

予定がない場合は生成しないようにできない?

はい、予定がない場合にはGemini AIを呼び出して応援メッセージを生成しないようにコードを調整することができます。このためには、sendEventsToChatwork関数内で、イベントの数が0であるかどうかをチェックし、0の場合はGemini AIの呼び出しをスキップする必要があります。
以下は、そのように調整されたコードの例です:

function sendEventsToChatwork() {
  // 4つのカレンダーIDと名前のマッピング
var calendars = {
'calendar_id_1': 'カレンダー1の名前',
'calendar_id_2': 'カレンダー2の名前',
'calendar_id_3': 'カレンダー3の名前',
'calendar_id_4': 'カレンダー4の名前'
};

  var chatworkToken = 'xxxxxxxxxxxxxxxxxxxxxxxxx'; // チャットワークAPIトークン
  var roomId = '00000000'; // チャットワークのルームID

  Object.keys(calendars).forEach(function(calendarId) {
    var today = new Date();
    var events = CalendarApp.getCalendarById(calendarId).getEventsForDay(today);

    var message = '[info][title]' + calendars[calendarId] + 'の本日の予定[/title]';
    for (var i = 0; i < events.length; i++) {
      var event = events[i];
      message += '- ' + event.getTitle() + ' (' + formatTime(event.getStartTime()) + ')\n';
    }

    // 予定がある場合のみGemini AIを呼び出して応援メッセージを生成
    if (events.length > 0) {
      var encouragement = getEncouragementFromGemini(events);
      message += encouragement ? '\n' + encouragement : '';
    } else {
      message += '予定はありません。';
    }

    message += '[/info]';

    sendToChatwork(roomId, message, chatworkToken);
  });
}

// getEncouragementFromGemini, sendToChatwork, formatTime関数は変更なし

また省略されてしまいましたが、指定された部分を修正すると動きました\(^o^)/

まとめ

最終的にはプロンプトに書いてあることがGeminiに指示として送られるのでここを変えてあげればどんなメッセージでも作れます。

ここです→var prompt = ‘今日の予定に基づいてポジティブな応援メッセージを一言で: ‘ + eventTitles;

現在は松岡修造風にポジティブで熱い応援メッセージを送るように設定してますが、うまくコントロールできない部分も結構あります。ここはプロンプト芸で頑張るしかなさそうですね☹

今後も面白そうな業務改善があったらシェアしますので、ぜひ見に来てくださいね、それではさようならm(__)m

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

コメントは日本語で入力してください。(スパム対策)

目次