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

以前、[【GAS】Googleカレンダーに予定を入力、スプレッドシート使用](http://qiita.com/freshcl/items/4db73e89ead0296d933d) というのを書きました。今回は、それを少しだけ改善して、スプレッドシートで予定の色を指定できるようにしました。

## 1. Googleカレンダーでの色
手動で予定を書き込む時、予定（イベント）の色はカラーパレットから選べますが、ここではスプレッドシートからGASで予定を追加するので、色はcolorId（1〜11の数値）で指定します。
![20250331color.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157289/6a612930-13eb-4f32-b5c2-d615d51dd43d.png)

## 2. スプレッドシート
予定の色指定用の一列を追加しました（H列）。colorId（1〜11の数値）を記入します。空欄にすると予定の色はカレンダーの色となります。不正な値を記入しておくとエラーになります。
![20250331ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157289/b464f03c-32ff-4967-9513-a9a372d61316.png)

## 3. スクリプト
前回から変更しているのは4か所だけ。行の後ろに　＊＊変更＊＊　と書いています。

```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 = 8; //最後の列　　　＊＊＊＊＊変更＊＊＊＊＊＊
  const colnum = col2 - col1 +1; //データの列数
  
  //データ範囲の取得
  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列:予定のタイトル  
    let startday = new Date(mydata[i][1]); //B列:開始日
  //開始時刻が空であれば終日予定とする
    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;  
    }
    let location1 = mydata[i][5]; //F列:場所
    let description1 = mydata[i][6]; //G列:説明
    let colorId = mydata[i][7]; //H列：colorId＊＊＊＊＊変更＊＊＊＊＊＊
    let options = { location: location1, description: description1 };    

    if (allday) {
      //終日の予定を作成
      mycalendar.createAllDayEvent(
        title,
        startDate,
        endDate,
        options
        ).setColor(colorId);  //      ＊＊＊＊＊変更＊＊＊＊＊＊
    } else {
      mycalendar.createEvent(
        title,
        startDate,
        endDate,
        options
        ).setColor(colorId);  //       ＊＊＊＊＊変更＊＊＊＊＊＊
    }
  }
}
/////////////////////////////////////////
//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;
}
```