1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Googleフォームの選択項目(プルダウン)にカレンダーの予定がない時間を自動反映するやり方のプログラムメモ

Last updated at Posted at 2023-09-17

プルダウンに予定追加

YouTubeでの解説:https://youtu.be/npqXVS1gq5U

プログラミングやGoogleの仕組みを全く知らない超初心者でも、動画の通りにやれば動くと思います。業務効率化や自動化に取り組もうとしている人にとって、参考になればと思います。

formCreate.gs
// https://docs.google.com/forms/d/**************************************/edit
const FORM_ID  = "**************************************"; // フォームIDを入力
const MAIL_ID  = "**************************************"; // メールアドレスを入力
const FORM     = FormApp.openById(FORM_ID);                // フォーム紐付け
const CALENDAR = CalendarApp.getCalendarById(MAIL_ID);     // カレンダー紐付け
function shareSchedule() {
  const NOW = new Date(); // 現在時刻

  // チームメンバーの出勤予定日から候補を作る
  let startTime = new Date( NOW.getTime() + (      24 * 60 * 60 * 1000 ) ); // 24時間後
  let endTime   = new Date( NOW.getTime() + ( 30 * 24 * 60 * 60 * 1000 ) ); // 1ヶ月後
  const options = {
    search: '出勤予定日'
  }

  // 1ヶ月間のイベントを取得し、出勤予定日を取得
  const workingDays = CALENDAR.getEvents( startTime, endTime, options );
  const aPreferredDateList = [];

  // 候補日リストを作る
  for ( event of workingDays ) {
    const date    = new Date( event.getEndTime().getFullYear(), event.getEndTime().getMonth(), event.getEndTime().getDate() - 1 );
    for ( t = 11; t <= 16; t++ ) { // 11時〜16時 の間で取得
      date.setHours( t );
      const sDate = Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy/MM/dd H:mm' );
      if ( aPreferredDateList.indexOf( sDate ) === -1 )
        aPreferredDateList.push( sDate);
    }
  }

  // 当日の候補は削除
  for ( i = 0; i < aPreferredDateList.length; i++ ) {
    date = new Date( aPreferredDateList[ i ] ).getDate();
    if ( date === NOW.getDate() ) {
      aPreferredDateList.splice( i, 1 );
      i -= 1;
    }
  }

  // 他のスケジュールと重複する場合は候補から削除する
  startTime = new Date( NOW.getTime() + (      24 * 60 * 60 * 1000 ) ); // 24時間後
  endTime   = new Date( NOW.getTime() + ( 30 * 24 * 60 * 60 * 1000 ) ); // 1ヶ月後
  const allEvents = CALENDAR.getEvents( startTime, endTime );
  for ( event of allEvents ) {
    if ( !event.getTitle().match( /出勤予定日/ ) ) {
      startTime = event.getStartTime().getTime() - ( 1 * 60 * 60 * 1000 );
      endTime = event.getEndTime().getTime();
      for ( i = 0; i < aPreferredDateList.length; i++ ) {
        date = new Date( aPreferredDateList[ i ] ).getTime();
        if (( startTime <= date ) && ( date <= endTime ) ) {
          aPreferredDateList.splice( i, 1 );
          i -= 1;
        }
      }
    }
  }

  // プルダウンに選択肢を追加
  const items = FORM.getItems( FormApp.ItemType.LIST );
  for ( item of items ) {
    if ( item.getTitle() === '第一希望' || item.getTitle() === '第二希望' || item.getTitle() === '第三希望' ) {
      const list = item.asListItem();
      list.setChoiceValues( aPreferredDateList );
    }
  }
  console.log(aPreferredDateList);
}

予定をカレンダーに追加&メール通知

*2023年9月22日18時更新
*フォームを「第一希望〜第三希望」ではなく、「開催日」に変更してください。あと、アジェンダも追加してください。

解説YouTube: https://youtu.be/j-XN8lGbDG0

updateCalendar.gs
function sendForm(e) {
  // 名前	メールアドレス 開催日	アジェンダ
  const name   = e.namedValues['名前'][0] // 名前
  const email  = e.namedValues['メールアドレス'][0] // メールアドレス
  const date   = e.namedValues['開催日'][0] // 開催日
  const agenda = e.namedValues['アジェンダ'][0] // アジェンダ

  // 予定をGoogleカレンダーに追加
  const title = `${name} 様とのミーティング`; // タイトル
  const start_time = new Date(date); // 予定の開始時間
  const end_time   = new Date(start_time.getTime() + (1000 * 60 * 30)); // 予定の終了時間
  let options = {
    description: `${agenda}\n\nフォームからの自動追加`
  }
  CALENDAR.createEvent(title, start_time, end_time, options);
  
  // 予約追加のメール送信
  const message = `${name} 様より、ミーティング予約\n\n日時:${date}\n内容:${agenda}`;
  // options = {
  //   bcc: MAIL_ID
  // }
  GmailApp.sendEmail(email, title, message);
  
  // フォームの開催日を更新
  shareSchedule();
1
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?