7
3

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.

GASでGoogleカレンダーに自動予約する

Posted at

はじめに

社用車の利用時にGoogleカレンダーで予約して、手書で台帳に記入していたため、手間と管理に苦労していました。
GASを使用して、スプレッドシートに必要事項を入力すると自動でカレンダーに予約されるようにしてみました。

手順

1.スプレッドシートに社用車予約シートと管理台帳を作成します。
image (20).png
image (19).png

2.拡張機能からApps Scriptを開いてコードを入力します。

▼社用車のカレンダーID、通知先、予約シートの定義

// 社用車のカレンダーID
const car_id = '■■■■ @resource.calendar.google.com';

// 社用車予約シート取得
const sheet = SpreadsheetApp.getActiveSheet();
const allSheet = SpreadsheetApp.getActiveSpreadsheet();

// 通知したい人
const noticeTarget = ["user1@example.com, user2@example.com"];

▼メニューに実行ボタンの追加

function onOpen()
{
  let ui = SpreadsheetApp.getUi()
  // メニュー名を決定
  let menu = ui.createMenu('GAS');
  // メニューに実行ボタン名と関数を割り当て
  menu.addItem('予約','main');
  // スプレッドシートに反映
  menu.addToUi();
}

▼メインメソッド

function main()
{
  // 入力値を取得
  let valueList = getInput(sheet);
  if(!valueList){return}

  // 空き状況を確認
  if(!checkReserveCar(valueList)){return}
  // カレンダー予約
  entryCalendar(valueList);
  // 管理台帳更新
  insertList(valueList);
  // 入力シートリフレッシュ
  refreshInput();

  Browser.msgBox("予約が完了しました。");
}

▼入力情報の取得

function getInput()
{
  let valueList = Array();

  // 利用者名取得
  let userAddress = sheet.getRange("B3").getValue();

  // 所属部署
  let userDepatment = sheet.getRange("B4").getValue();

  // 行先
  let goTo = sheet.getRange("B5").getValue();

  // 目的
  let detail = sheet.getRange("B6").getValue();

  // ETC
  let useETC = sheet.getRange("B7").getValue();

  // 使用開始日時
  let startDateTime = sheet.getRange("B8").getValue();

  // 使用終了日時
  let endDateTime = sheet.getRange("B9").getValue();

  // 入力チェック
  if(userAddress === "" || goTo === "" || detail === "" || useETC === "" || startDateTime === "" || endDateTime === "")
  {
    Browser.msgBox("必須項目が入力されていません");
    return false;
  }

  // 選択チェック
  if(useETC != "" && useETC != "不要")
  {
    Browser.msgBox("ETC利用の選択が正しくありません。");
    return false;
  }

  // 同乗者
  let riding = Array();
  let ride1 = sheet.getRange("B10").getValue();
  riding.push(ride1);
  let ride2 = sheet.getRange("B11").getValue();
  riding.push(ride2);
  let ride3 = sheet.getRange("B12").getValue();
  riding.push(ride3);
  let ride4 = sheet.getRange("B13").getValue();
  riding.push(ride4);
  riding = riding.filter(Boolean);

  valueList.push(userAddress);   //0
  valueList.push(userDepatment); //1
  valueList.push(goTo);          //2
  valueList.push(detail);        //3
  valueList.push(useETC);        //4
  valueList.push(startDateTime); //5
  valueList.push(endDateTime);   //6
  valueList.push(riding);        //7

  return valueList;
}

▼社用車の空き状況の確認

function checkReserveCar(valueList) {
  // カレンダー取得
  var roomCalender = CalendarApp.getCalendarById(car_id);
  let start = new Date(valueList[5]);
  let end = new Date(valueList[6]);

  // 日時を指定してイベント数を取得
  var events = roomCalender.getEvents(start, end);

  if(events.length != 0)
  {
    Browser.msgBox("既に予約が埋まっています。");
    return false;
  }

  return true;
}

▼カレンダーの予約

function entryCalendar(valueList)
{
  // カレンダー取得
  const calendar = CalendarApp.getDefaultCalendar();
  const title = '社用車使用予定'
  const option = {
    description: 
      '行先:'+ valueList[2] +"\n"+
      '目的:'+ valueList[3] +"\n"+
      'ETC:'+ valueList[4] +"\n\n"+
      '使用後は以下のシートを入力してください。'+"\n"+
      '(管理台帳シートのURL)',
    guests: noticeTarget + "," + car_id+","+ valueList[7]
  }

  let start = new Date(valueList[5]);
  let end = new Date(valueList[6]);

  calendar.createEvent(title,start,end,option);
}

▼入力した内容を社用車管理台帳シートに反映

function insertList(valueList)
{
  let inputSheet = allSheet.getSheetByName("社用車管理台帳");
  let inputLow = inputSheet.getLastRow() + 1;

  inputSheet.getRange("A" + inputLow).setValue(inputLow - 4);
  inputSheet.getRange("E" + inputLow).setValue(valueList[0]);
  inputSheet.getRange("F" + inputLow).setValue(valueList[1]);
  inputSheet.getRange("G" + inputLow).setValue(valueList[2]);
  inputSheet.getRange("H" + inputLow).setValue(valueList[3]);
  inputSheet.getRange("I" + inputLow).setValue(valueList[4]);
  inputSheet.getRange("J" + inputLow).setValue(valueList[5]);
  inputSheet.getRange("K" + inputLow).setValue(valueList[6]);
  inputSheet.getRange("L" + inputLow).setValue(valueList[7][0]);
  inputSheet.getRange("M" + inputLow).setValue(valueList[7][1]);
  inputSheet.getRange("N" + inputLow).setValue(valueList[7][2]);
  inputSheet.getRange("O" + inputLow).setValue(valueList[7][3]);
}

▼入力台帳をリフレッシュする

function refreshInput()
{
  sheet.getRange("B3").clearContent();
  sheet.getRange("B4").clearContent();
  sheet.getRange("B5").clearContent();
  sheet.getRange("B6").clearContent();
  sheet.getRange("B7").clearContent();
  sheet.getRange("B8").clearContent();
  sheet.getRange("B9").clearContent();
  sheet.getRange("B10").clearContent();
  sheet.getRange("B11").clearContent();
  sheet.getRange("B12").clearContent();
  sheet.getRange("B13").clearContent();
}

3.コードを保存して予約シートに内容を入力し、メニューから「予約」を押下します。

▼結果
image (18).png

おわりに

今回はGASを使用した例を紹介しました。
手書になる作業など、これは自動化してほしい!という作業がまだたくさんあると思いました。
GASを応用して、他にも自動化できる管理作業があれば、少しでも楽になるように色々試してみたいと思います!

共同開発者:@k-sato-ice

7
3
0

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
7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?