
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);
}