見出し画像

Googleフォームでカレンダーと自動予約連携の方法

調べたノウハウを忘備録としてスタンプしていく!

まずは、
①GoogleドライブよりGoogleフォームで新規作成をし項目を追加していく
②GoogleフォームからGoogleスプレッドシートを連携し開く
➂Googleスプレットシートの「拡張機能」から「Apps Script」を開く
④Apps Scriptのコード.gsに下記のコードを記載する
その際、上段にある
1)GoogleフォームID
2)GoogleアカウントIDのメールアドレス
3)GoogleカレンダーID
を入力(***********************)を参照

ポイント:
・01 Googleカレンダー上の「出勤予定日」終日予定に対して予約可能日程が表示される
・01  ( 10 * 24 * 60 * 60 * 1000 ) 最初の「10」はendの期間=10日と設定、その他の24.60.60.1000は1日をミリ秒に換算し計算させるため
・02 ( t = 10; t <= 19; t += 3 )は 10時~19時、間隔は3時間と指定
・06 Googleフォームの項目(プルダウン)に予約日を自動表示させる
( item.getTitle() === '予約日' )
項目タイトルを「予約日」に合わせると表示される。
その際、( FormApp.ItemType.LIST )に指定したプルダウン形式にフォーム側を合わせる
・07 スプレッドシートの列の値を取得しカレンダーへ登録する情報を指定する。
・08 values[*]でA→B列の順に設定している。そのデータをconst timestamp等に格納指示。const timestampは意味が分かるように設定(何でも可)
const timestamp = values[0]; // タイムスタンプ
const email = values[1]; // メールアドレス
・・・・と
・09 予定をGoogleカレンダーに追加
(start_time.getTime() + (1000 * 60 * 120) =120分として予約を入力される
・10 予約追加のメール送信
上記で設定したgoogleIDで送信される。またカレンダー予約メールはカレンダー所有IDへ送信される為、必要に応じてgメールの転送設定をしておく

最後にトリガー2つを設定し終了
・フォームへ予約可能日程を読み込むトリガー
・フォームが送信された際にカレンダー追加登録およびメール配信をするトリガー



// https://docs.google.com/forms/d/**************************************/edit

const FORM_ID  = "***********************************"; // フォームIDを入力
const MAIL_ID  = "***********************************"; // メールアドレスを入力
const CALENDAR_ID  = "*******************************"; // メールアドレスを入力
const FORM     = FormApp.openById(FORM_ID);                // フォーム紐付け
const CALENDAR = CalendarApp.getCalendarById(CALENDAR_ID);     // カレンダー紐付け

function shareSchedule() {
  const NOW = new Date(); // 現在時刻

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

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

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

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

  // 05 他のスケジュールと重複する場合は候補から削除する
  startTime = new Date( NOW.getTime() + (      24 * 60 * 60 * 1000 ) ); // 24時間後
  endTime   = new Date( NOW.getTime() + ( 10 * 24 * 60 * 60 * 1000 ) ); // 1ヶ月後(10日後)
  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;
        }
      }
    }
  }

  // 06 プルダウンに選択肢を追加
  const items = FORM.getItems( FormApp.ItemType.LIST );
  for ( item of items ) {
    if ( item.getTitle() === '予約日' ) {
      const list = item.asListItem();
      list.setChoiceValues( aPreferredDateList );
    }
  }
  console.log(aPreferredDateList);
}

function sendForm(e) {
  // 07 スプレッドシートの列の値を取得
  var values = e.range.getValues()[0];

  // 08 各列に対応するデータを取得
  const timestamp = values[0]; // タイムスタンプ
  const email = values[1]; // メールアドレス
  const name = values[2]; // お名前
  const date = values[3]; // 予約日
  const negotiationMethod = values[4]; // 商談方法
  const issue = values[5]; // 貴社の課題
  const companyName = values[6]; // 会社名
  const department = values[7]; // 部署名・役職
  const address = values[8]; // ご住所
  const phoneNumber = values[9]; // 電話番号

  // 09 予定をGoogleカレンダーに追加
  const title = `${companyName} (${name}) 様との商談自動追加`; // タイトル
  const start_time = new Date(date); // 予定の開始時間
  const end_time = new Date(start_time.getTime() + (1000 * 60 * 120)); // 予定の終了時間120分
  let options = {
    description: `${companyName}\n\n商談フォームからの自動追加\n▼申込内容\nお名前: ${name}\nメールアドレス: ${email}\n予約日: ${date}\n商談方法: ${negotiationMethod}\n会社名: ${companyName}\n部署・役職名: ${department}\n電話番号: ${phoneNumber}\nご住所: ${address}\n貴社の課題: ${issue}`
  };

  CALENDAR.createEvent(title, start_time, end_time, options);
  
  // 10 予約追加のメール送信
  const message = `${name} 様からの、商談予約を承りました。\n\n会社名:${companyName}\n日時:${date}\n商談方法:${negotiationMethod}\nご住所:${address}\n電話番号:${phoneNumber}\n\n貴社の課題:${issue}\n\n-----------------------------\n株式会社コレクトプレイス\nTEL:024-983-9568\n■日程の変更等がありましたら本メールまたは電話番号へご連絡ください。`;
  // options = {
  //   bcc: MAIL_ID
  // }
  GmailApp.sendEmail(email, title, message);
}

この記事が気に入ったらサポートをしてみませんか?