有馬総一郎のブログ

(彼氏の事情)

2024年03月09日 09:45:32 JST - 3 minute read - Google

Google Formの回答からicsファイルを添付したメールを送信する

前回、回答された日付型項目の値から、受信者がGoogle Calendarに予定追加するリンクを埋め込んだメールを送信したが、今度はicsファイル1を埋め込んだ形でメールを送信する。

Gmail

icsファイル

icsファイルの形式は、単純なものなら難しくない。 カレンダーにまつわる標準まとめ #timezone - Qiitaが詳しい。PRODIDがよってはメールアドレスだったり、UIDは一意のものを設定しなければならないとかあるけど、そんなキッカリ定まってないというのか、カレンダーアプリによるようだ。

function createIcs(startDateTime, endDateTime) {
  const summary = "用件";
  const description = "https://us02web.zoom.us/j/12345678901?pwd=10841313bC8e5C81183048f160c79d2C\\nミーティングID: 12345678901\\nパスワード: password";
  const ics =`
BEGIN:VCALENDAR
PRODID:-//arimasou16/handcal/NONSGML v1.0//EN
VERSION:2.0
UID:${Utilities.getUuid()}
BEGIN:VEVENT
SUMMARY:${summary}
DTSTART;TZID=Asia/Tokyo:${Utilities.formatDate(startDateTime, "JST", "yyyyMMdd'T'HHmmss")}
DTEND;TZID=Asia/Tokyo:${Utilities.formatDate(endDateTime, "JST", "yyyyMMdd'T'HHmmss")}
LOCATION:東京ドーム
DESCRIPTION:${description}
ORGANIZER;CN=有馬総一:mailto:arimasou16@test.com
ATTENDEE;ROLE=CHAIR;PARTSTAT=DELEGATED;CN=有馬総一:mailto:arimasou16@test.com
END:VEVENT
END:VCALENDAR
`;
  return ics;
}

こんな調子で作成したicsファイルを添付すればいい。

イベント取得

これだけじゃつまらないので、もし日付選択で不都合があったりしたりしたときに、icsを追加しない形にしてみた。

自身で予定を既に作成しておき、その予定の開始時間と終了時間が一致しない場合は、追加しないとした。

  const cal = CalendarApp.getCalendarById('Gmailアドレス');
  const startDateTime = new Date(reserveDate);// 予定の開始日時
  startDateTime.setHours(9);
  startDateTime.setMinutes(40);
  const endDateTime = new Date(reserveDate);// 予定の開始日時
  endDateTime.setHours(23);
  endDateTime.setMinutes(55);
  const ics = createIcs(startDateTime, endDateTime);
  const events = cal.getEvents(startDateTime, endDateTime);
  const options = {
    htmlBody: htmlBody
  };
  if (events.length > 0) {
    options.attachments = [
      {
        fileName:"invite.ics",
        content: ics,
        mimeType:'text/calendar'
      }
    ]
  }
  // メール送信
  MailApp.sendEmail(
    response.email,
    subject,
    textbody,
    options
  );
}

ググると逆に他の予定と被っている場合は、イベント作成しないなどのやり方が紹介されたりする。

本当は、既に追加したイベントを元にicsファイルを添付したり、予定詳細をメールする方法を探っていたが、分からなかった。

Google Calendarの予定登録のリンクだとGoogle Calendarを使っている人以外は予定を登録することが出来ないが、icsファイルの添付なら、他のサービスでも予定の登録が出来る。outlookで試したところ、一応、こちらもで上手くいった。

Outlook

  1. icsファイルの仕様についてはこちら。 RFC 5546 - Internet Calendaring and Scheduling Core Object Specification (iCalendar) 日本語訳。以前はRFC 2445だったが廃止されてRFC 5546となっている。 ↩︎