ChatGPTとGoogleカレンダーのメール通知で複数社の役員任期管理を行う(Google Apps Script)

概要

ChatGPTにコードを聞いて、Googleスプレッドシートに列記した会社情報・役員任期満了予定日をGoogleカレンダーに一括登録し(Google Apps Scriptを利用)、任期満了日の一定期間前にメールで通知アラートを出すという、簡易的な任期管理の方法を実践します。

手順
  • 1/8 Googleのサブアカウントを作成
  • 2/8 Googleスプレッドシートを作成
  • 3/8 ChatGPTにコードを聞く
  • 4/8 Google Apps Scriptにコピペ
  • 5/8 Googleカレンダーで確認
  • 6/8 Googleカレンダーの通知設定
  • 7/8 Gmail転送設定・カレンダーの登録
  • 8/8 スプレッドシートの修正・追加
1/8 Googleのサブアカウントを作成

Google アカウント

・普段使用しているGoogleアカウントでの利用は推奨しません

※本手法は、シート上の会社情報を修正・追加してカレンダーに反映したい場合に、カレンダーのイベントを全削除して登録し直す前提であるため

・サブアカ作成後は、サブアカID・PASSでログイン(Crome/Edge等のブラウザ自体もサブアカでログインする)

2/8 Googleスプレッドシートを作成

・サブアカのマイドライブから新規でスプレッドシートを作成

・シートに社名、任期、就任日、任期満了予定日等を入力

(例)1行目は項目名とし、A列に社名、B列に役員(任期管理する役員種別)、C列に任期(年)、D列に最終の就任日(※便宜上、定時株主総会の日をベースとする)、E列からN列に任期満了予定日(※便宜的に10回分とする)

※D列の就任日(総会日)をベースとして、C列の任期(年)後、任期満了となる総会日(目安)をカレンダー登録し、一定期間前にメール通知させる
※D列を就任日(総会日)でなく、事業年度末日として管理する方法も考えられる(当該日にかかる定時株主総会により任期が満了する)
※カレンダーには、A列(社名)とB列(役員種別)をイベント名とし、E列からN列(任期満了予定日)の年月日で登録させる

・任期満了予定日を10回分入力した場合のシート↓

※なお、任期満了予定日はあくまで目安(就任日の定時総会と任期年数経過後の定時総会が同日とは限らないため)
※任期満了予定日は本手法では便宜上10回分とするが、適宜増減可(ただし増やしすぎると処理が遅くなる恐れ)

・任期満了予定日の関数(EDATE)につき

※任期満了予定日(E列からD列)は、EDATE関数を利用することで、就任日(総会日)から任期(年)×12か月経過後の年月日を算出することが可、オートフィルでのコピーが捗る(=EDATE(就任日セル,$任期セル*12))
※EDATE内のC列(任期(年))は「$」で固定すると捗る
※任期満了予定日は、別の関数で出力してもよいし、手打ちでもよい
※上記はあくまで一例で、各所・各社のニーズに合わせて、入力項目はカスタマイズ可(その場合は、カスタマイズした内容でChatGPTに質問し、スクリプトを出力してもらえばよい)
3/8 ChatGPTにコードを聞く

・ChatGPTにログイン(未登録ならサインアップ)し、Googleスプレッドシート上のデータをGoogleカレンダーに登録するためのコードを聞きます

(上述の例で、カレンダーに登録されるイベント名を、A列(社名)とB列(役員種別)を「_」で繋いだ名称(例:TEST_A_取締役)とし、E列からN列の任期満了①~⑩をイベント(終日)として登録する場合)

質問例(プロンプト)

Googleスプレッドシート上のデータを使用して、Googleカレンダーに全日イベントを作成したいです。イベントのタイトルはスプレッドシートのA列とB列のデータを”_”でつなげたものとしたいです。また、イベントの日付はE列からN列のデータに基づいて設定したいです。有効な日付が存在する場合のみイベントを作成し、無効な日付(例えば空のセルや非日付データ)は無視するようなGoogle Apps Scriptを教えてください。

※スプレッドシートに入力した情報、出力したい情報に合わせて、適宜プロンプトは改変してください
※GPT-4を利用(GPT-3.5でもそれっぽいコードは生成されるが精度が低く、追加質問でメンテナンスが必要)

・本質問で生成されたコード↓

function createAllDayEvent() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // アクティブなシートを取得
  var data = sheet.getDataRange().getValues(); // シートの全データを取得

  var calendar = CalendarApp.getDefaultCalendar(); // デフォルトのカレンダーを取得

  // 全行のデータに対してループを回す(1行目のヘッダーを除くため、i=1からスタート)
  for (var i = 1; i < data.length; i++) {
    var row = data[i];
    var title = row[0] + "_" + row[1]; // 「A列2行目以降」_「B列2行目以降」をイベントのタイトルとする

    // E列からN列までループを回す(JavaScriptでは4から13まで)
    for (var j = 4; j <= 13; j++) {
      var date = new Date(row[j]); // イベントの日付
      if (!isNaN(date.getTime())) { // 日付が有効ならイベントを作成
        calendar.createAllDayEvent(title, date);
      }
    }
  }
}
4/8 Google Apps Scriptにコピペ

・任期管理のスプレッドシートの「拡張機能」>「Apps Script」を選択

※「Apps Script」が開かない場合は、ブラウザが本アカウントのままでログインされていないかを確認(本アカをログアウトして、サブアカでログインする)

・ChatGPTに作成してもらったコードをコピペ

・適当な名称(任期管理等)とし、プロジェクトを保存

・承認が必要です>「権限を確認」>アカウント(サブアカ)を選択

・このアプリはGoogleで確認されてません>「詳細」>「(安全ではないページ)に移動」>「許可」

・「▷実行」

・実行ログ欄に「実行完了」が表示されるのを待つ

※エラー表示が出る場合は、ChatGPTにエラーが出る旨とエラーメッセージを伝えて修正してもらう
5/8 Googleカレンダーで確認

・カレンダー上に、任期満了年月日のタイミングでイベントが入っているか確認

・反映されていれば、任期満了予定日の登録は完了

6/8 Googleカレンダーの通知設定

マイカレンダーの設定
・「予定の通知」(メールで通知したいタイミングを設定する、複数可、例:4週前・1週前等)

※なお、本設定はあくまでサブアカのGmailアドレスに通知されるのみであるので、本アカのGmailアドレスにも通知をさせたい場合は、次(7/8)のGmail転送設定を行うか、本アカのカレンダーにサブアカのカレンダーを登録して通知設定を行う必要がある
7/8 Gmail転送設定orカレンダーの登録

(本アカのアドレスにもメール通知をしたい場合)

・サブアカから本アカへメール転送の設定を行う(サブアカのGmail設定)

(本アカのカレンダーにも任期満了予定日を表示させたい場合)

・本アカのGoogleカレンダーでサブアカのカレンダーを登録する(本アカの「設定」>「マイカレンダーの設定」>「カレンダーを追加」>「カレンダーに登録」(サブアカのGmailアドレスを入力))

・サブアカのGmailアドレスに、カレンダー共有のリクエストが届くので受容する

・本アカのGoogleカレンダーにサブアカのイベント(任期満了予定日)が反映されていることを確認
・本アカのGoogleカレンダーの「設定」>「他のカレンダー(サブアカ)の設定」から、予定の通知を設定を行う(上述6/8と同じ要領)

8/8 スプレッドシートの修正・追加

スプレッドシート上の社名・任期を変更したり、新しく任期管理する会社を行に追加したい場合

・上記設定のみではスプレッドシートの情報を修正しても反映されない

・スクリプトへのコード追記やトリガー設定する方法もありえるが、カレンダーに新旧のイベントが重複しがち(ChatGPTに聞いてもムズいって言う)

・サブアカのカレンダーの「設定」>「カレンダーの削除」で予定を完全削除して、Google Apps Scriptから、スクリプトを再度「▷実行」して登録し直すのが手っ取り早い

※カレンダーのイベントを削除する際は、サブアカウントでログインされていることをよくよく確認し、本アカウントのカレンダーのイベントを削除しないように
※本アカのカレンダーで、サブアカのカレンダーを登録していた場合(上述7/8の工程)は、サブアカのカレンダーの予定を完全削除すると、本アカのカレンダー上でもサブアカのカレンダーのイベントが削除される(スクリプトを「▷実行」して、サブアカのカレンダーに再度イベントが登録されると、本アカのカレンダーにも反映される)

タイトルとURLをコピーしました