【GAS】Googleカレンダーに予定を入力、スプレッドシート使用

これを元に、予定の色が指定できるようにしたものがあります。↓こちらに書いています。
[【GAS】Googleカレンダーに予定を入力、スプレッドシート使用（その2）](https://qiita.com/freshcl/items/21dcc09a9cbf41072d79)



## １．目的
今まで、Googleカレンダーの予定をスプレッドシートに書き出すものを作りました（[【GAS】Googleカレンダーの一週間の予定をスプレッドシートに書き出す
](https://qiita.com/freshcl/items/98a593e5ffe2273f095a)、[【GAS】Googleカレンダーのデータをスプレッドシートに書き出す](https://qiita.com/freshcl/items/b7ddb0568ea53bc50135)）。今回は、スプレッドシートに予定をデータを入力し、それをカレンダーに取り込むものを作りました。スプレッドシートのコンテナバインドプロジェクトです。

## ２．使い方・画面
シートmainとして、カレンダーID、開始日、書き出し用のシート名を入力するシートを作っておきます。関数to_mycalendarを実行するボタンも作ってあります。
![Screenshot20240819_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157289/093f90fc-187b-32e5-9ddd-1bacc635ca57.png)
## ３．スクリプト
```javascript:to_calendar.gs
function to_mycalendar() {
  const myfile = SpreadsheetApp.getActiveSpreadsheet();
  const myfileId = SpreadsheetApp.getActiveSpreadsheet().getId();
  const sheetname1 = 'main';
  const mysheet = SpreadsheetApp.openById(myfileId).getSheetByName(sheetname1);
  const calendarId = mysheet.getRange('B2').getValue(); //カレンダーID
  const mycalendar = CalendarApp.getOwnedCalendarById(calendarId);
  const row1 = 5; //シートの最初のデータの行
  const row2 = mysheet.getLastRow(); //最後の行
  const datanum = row2 - 4; //データの行数
  const col1 = 1; //データの最初の列
  const col2 = 7; //最後の列
  const colnum = col2 - col1 +1; //データの列数
  let datacheck = true;
  
  //データ範囲の取得
  const mydata = mysheet.getRange(row1, col1, datanum, colnum).getValues();
  for (let i = 0; i < mydata.length; i++) {
    let allday = false; //終日予定であればtrue
    let days = true; //複数日にわたるのであればtrue
    let title = mydata[i][0]; //A列:予定のタイトル
    if (title === '') {
      datacheck = false;
    }  
    let startday = new Date(mydata[i][1]); //B列:開始日
    if (startday === '') {
      datacheck = false;
    }
  //開始時刻が空であれば終日予定とする
    if (mydata[i][2] === '') {
      allday = true;
    }
  //終了年月日が空であれば一日の予定とする
    if (mydata[i][3] === '') {
      days = false;
    }  
  //イベントの時間のタイプ
    let type = 2; //一日で、開始終了時刻がある。
    if (allday) {
      if (days) {
        type = 3; //複数日で、終日予定
      } else {
        type = 4; //一日で、終日予定
      }
    } else if (days) {
      type = 1; //複数日で、開始終了時刻あり
    }
    let starttime = new Date();
    let endday = new Date();
    let endtime = new Date();
    let startDate = new Date();
    let endDate = new Date();
    switch(type) {
      case 1: //複数日で開始終了時刻あり
        starttime = new Date(mydata[i][2]); //C列:開始時刻
        endday = new Date(mydata[i][3]); //D列:終了日
        endtime = new Date(mydata[i][4]); //E列:終了時刻
        startDate = datedate(startday, starttime);
        endDate = datedate(endday,endtime);
        break;
      case 2: //一日で開始終了時刻あり
        starttime = new Date(mydata[i][2]); //C列:開始時刻
        endtime = new Date(mydata[i][4]); //E列:終了時刻
        startDate = datedate(startday,starttime);
        endDate = datedate(startday,endtime);
        break;
      case 3: //複数日で終日
        startDate = new Date(startday);
        endDate = new Date(mydata[i][3]); //D列:終了日
        endDate.setDate(endDate.getDate() + 1); //終了日は次の日
        break;
      case 4: //一日で終日
        startDate = new Date(startday);
        endDate = new Date(startDate);
        endDate.setDate(endDate.getDate() + 1); //終了日は次の日
        break;  
    }
    if (startDate > endDate) {
      datacheck = false;
    }
    if (!datacheck) {
      let myui = SpreadsheetApp.getUi();
      myui.alert('エラー', 'シートのデータが不適切です',myui.ButtonSet.OK);
      return;
    }
    let location1 = mydata[i][5]; //F列:場所
    let description1 = mydata[i][6]; //G列:説明
    let options = { location: location1, description: description1 };    

    if (allday) {
      //終日の予定を作成
      mycalendar.createAllDayEvent(
        title,
        startDate,
        endDate,
        options
        );
    } else {
      mycalendar.createEvent(
        title,
        startDate,
        endDate,
        options
        );
    }
  }
}
//////////
//Date型を２つ受取り、１つ目の日付、２つ目の時分を持つDate型を返す
function datedate(date1,date2) {
  let date3 = new Date(date1);
  const hours2 = date2.getHours(date2);
  const minutes2 = date2.getMinutes(date2);
  date3.setHours(hours2);
  date3.setMinutes(minutes2);
  return date3;
}
```

一日の予定か、複数日に渡る予定か。終日の予定か、開始・終了時刻のある予定か。は、シートの所定の年月日・時刻の記載があるかどうかで判断しています。  
  
入力してあるべきデータが無かったり、開始日時より終了日時が前になっていたりする間違いがあれば、変数datacheckをfalseにして中止処理をしています。  
  
関数datedateは、Date型を２つ受取り、１つ目の年月日に２つ目の時分をいれて一つのDate型を返します。スプレッドシートでは年月日と時刻を別に記述しますが、時刻を10:30と入力しておくと、1899年12月30日10時30分になったりするので、年月日と時刻をくっつけるためにこの関数を使います。