悩めるいそっちGoogleカレンダーイベントをスプレッドシートに反映し、メール通知を自動化して業務管理

# 業務忘れ防止のためのアラート機能【Googleカレンダー＋スプレッドシート】




[![おじさん混乱（かわいい）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819170/d0429d12-1589-db53-0517-260b284b6eaa.jpeg)](https://qiita.com/qoabassest/items/924d401b98f8b08ec833)








## 通常業務だけではない。期限があり対応しなきゃいけない案件もある
Googleカレンダーに入力したイベント情報をスプレッドシートに反映させ、そのイベントが開始する前に自動で通知を送りたいと考えた背景には、通常業務以外に、期限のある報告、外部との商談等の予定、研修など多岐にわたります。業務開始する前のアラートとして通知できないか？と思い、記事を作成しました。初心者がChatGPTに相談しながら生成した具体的なコードを紹介します。

いそっちのnoteもよろしければご覧下さい

https://note.com/easy_ibis7274/n/ne1da9b33c32e?sub_rt=share_sb

Qiitaのバックナンバーはこちら。拙い文章です。成長を見守って下さい。

https://qiita.com/qoabassest/items/ece171db17f5d6d106a4

## 取り組んだ理由（人間は忘れる生き物だから）
カレンダー情報の管理と通知の自動化は、時間管理やプロジェクト管理において重要です。特に、複数のイベントを効率的に管理し、漏れなく通知を受け取ることで、業務の効率を高めることができます。しかし、手動でこれを行うのは煩雑で、作業が増えてしまい、業務を圧迫する可能性があります。

![おじさんパソコン.jfif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819170/69d440ac-2598-17f9-6b4d-c2559d547fdb.jpeg)


## それならばAIに作ってもらおう！助けてChatGPT

まずは質問。やりたいことを伝えてみるとしっかりと教えてくれました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819170/ce34c225-cd7e-68f2-9891-8e76b51d6d01.png)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819170/f1b1ba00-ab21-bb05-f51a-ece4e8af4fd3.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819170/0a6ac6a7-2de6-3959-3223-30f816b3028f.png)



言われた通りに実行します。
基本的には提示してもらったコードを使えばできましたが



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819170/7dc0b309-ee25-c8fe-c89c-0f60fe6e20d8.png)


ここの部分だけうまくいかずコードを生成しなおしてもらいました。言われた通りに実施しているのに、提示されたものがないのは少し残念でしたが、出ないことを伝えると出してもらえました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819170/d67f2fbf-78f7-a12e-147f-06965bff46b7.png)


エラーを修正したコードです。Googleカレンダーからイベント情報を取得し、スプレッドシートに反映させ、その後、指定したメールアドレスに通知を送信するコードを示します。これにより、カレンダーの情報をスプレッドシートに確実に反映させ、イベントの開始前に自動で通知を受け取ることが可能になります。
```javascript
// 1. カレンダーイベントをスプレッドシートに記録する関数
function fetchCalendarEvents() {
  // スプレッドシートとシートの取得
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheetByName('イベント通知');

  // シートが存在しない場合の処理
  if (!sheet) {
    Logger.log('シートが見つかりません: イベント通知');
    return;
  }

  // Googleカレンダーからイベントを取得
  var calendar = CalendarApp.getDefaultCalendar();
  var now = new Date();
  var future = new Date();
  future.setDate(now.getDate() + 7); // 今から1週間先までのイベントを取得

  var events = calendar.getEvents(now, future);

  // シートのクリア
  sheet.clear();

  // ヘッダーを設定
  sheet.getRange('A1:E1').setValues([['イベントタイトル', '開始時間', '終了時間', '詳細', '送信済み']]);

  // イベントをシートに追加
  var data = [];
  for (var i = 0; i < events.length; i++) {
    var event = events[i];
    data.push([event.getTitle(), event.getStartTime(), event.getEndTime(), event.getDescription(), '未送信']);
  }

  if (data.length > 0) {
    sheet.getRange(2, 1, data.length, data[0].length).setValues(data);
  }
}

// 2. スプレッドシートのデータをもとにメール通知を送信する関数
function sendEmailNotifications() {
  // スプレッドシートからデータを取得
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheetByName('イベント通知');
  var data = sheet.getDataRange().getValues();

  // メール送信先のアドレスを設定
  var emailAddress = 'qoabassest@gmail.com';
  
  // ヘッダーを除くデータを取得
  for (var i = 1; i < data.length; i++) {
    var title = data[i][0];
    var startTime = new Date(data[i][1]);
    var endTime = new Date(data[i][2]);
    var description = data[i][3];
    var status = data[i][4]; // 送信済みの状態を取得
    
    // イベントが1日以内に開始される場合のみメールを送信
    var now = new Date();
    var timeDiff = startTime.getTime() - now.getTime();
    var daysDiff = timeDiff / (1000 * 3600 * 24);
    
    if (status === '未送信' && daysDiff <= 1 && daysDiff >= 0) {
      // メールの内容
      var subject = 'Upcoming Event: ' + title;
      var body = 'Title: ' + title + '\n' +
                 'Start Time: ' + startTime + '\n' +
                 'End Time: ' + endTime + '\n' +
                 'Description: ' + description;
      
      // メール送信
      try {
        MailApp.sendEmail(emailAddress, subject, body);
        // スプレッドシートに「送信済み」とマークする
        sheet.getRange(i + 1, 5).setValue('送信済み');
      } catch (e) {
        Logger.log('メール送信エラー: ' + e.toString());
      }
    }
  }
}

// 3. 最新のカレンダー情報を取得して、メール送信まで行う自動処理
function updateCalendarAndNotify() {
  fetchCalendarEvents(); // カレンダーからイベントを取得しスプレッドシートに記録
  sendEmailNotifications(); // 記録されたイベントに基づきメールを送信
}

```



コードが完成し、実行をすると...


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819170/7bed2ed0-3823-c188-a8bd-7776c7ba6b71.png)
カレンダーの予定がスプレッドシートに飛びます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819170/8cc8a48d-9350-4322-f8a0-4e5a527253ae.png)
過ぎてしまった予定は反映されません。未来の予定のみが飛んでいました。とりあえずやりたいことはできました。





![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819170/11d51e65-e58e-5904-32ce-b10b0fd3cb3a.png)

今回AIに助けてもらったことは

:::note info
Apps Scriptのコード作成
:::

:::note info
イラストの作成
:::


:::note info
Qiitaのマークダウン方式文章の仮組
:::

イラストの作成はなかなか楽しかったです。
個人的にはChatGPTのイラストよりCOPILOTのイラストのタッチが好きで多く使っていました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819170/84a4a8e8-49b5-70a7-83a3-2c04623730d0.png)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819170/b6fddc72-28f3-58d9-73d3-e762b72a1bb5.png)

AIと会話しながらイラスト作成できるなんてすごい世の中になりましたね（遠い目）

## 形になったけどゴールではないです
コードを利用することで、Googleカレンダーのイベントを自動的にスプレッドシートに反映し、イベントの開始前に自動で通知を受け取ることが可能になりました。。これにより、イベント管理がより効率的に行えるようになりますが、この機能を応用して、カレンダーの共有で同僚の予定の把握をすることや、研修が期限までに実施できているか期日が近づいたらアラートする機能、安否確認など返答が必要なものを告知することもできると思うので、取り組みたいと思っています。回答の促しや、情報の一斉発信は、同僚もできればいいねと言っておりました。次の安否確認で実験することになっています。経過も報告できればと思います。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819170/057b325f-05a7-ef46-0d14-db16c1457ba7.png)