【GAS】Googleカレンダーの一週間の予定をスプレッドシートに書き出す

## １．目的
前回、開始日・終了日を指定して、Googleカレンダーのその間の予定をスプレッドシートに書き出すものを作りました([【GAS】Googleカレンダーのデータをスプレッドシートに書き出す](https://qiita.com/freshcl/items/b7ddb0568ea53bc50135))。
今回は、開始日を指定して、その日を含め1週間分の予定（イベント）をスプレッドシートに書き出します。1週間毎に予定表を作る場合、これを元に作ったり、予定表にコピペしたりするのに使えます。スプレッドシートのコンテナバインドプロジェクトです。
## ２．使い方・画面
シートmainとして、カレンダーID、開始日、出力シート名を入力するシートを作っておきます。出力シートと同じ名前のシートがあれば、削除され新しいシートが作られます。mycalendar2を実行するボタンも作ってあります。  
![Screenshot20240819_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157289/74aefd43-37d2-af53-45ee-a02834a276bb.png)
出力シートには、5行目に月日、6行目に曜日、7行目その日の予定が書き出されます。複数の予定がある場合は、カンマでつなげて表示します。  
![Screenshot20240819_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157289/47193819-483a-0084-6123-8e3bbd1a581a.png)
## ３．スクリプト
```javascript:calendar_d2.gs
function mycalendar2() {
  const myfile = SpreadsheetApp.getActiveSpreadsheet(); //このファイル（スプレッドシート）
  const myspreadsheetId = SpreadsheetApp.getActiveSpreadsheet().getId(); //このスプレッドシートのId
  const today = new Date();
  const date1 = 'yyyy-MM-dd_HH:mm:ss'; //日付の書式1
  const today2 = Utilities.formatDate(today, 'JST', date1);
  const sheetname1 = 'main'; //メインシート名
  const mysheet = SpreadsheetApp.openById(myspreadsheetId).getSheetByName(sheetname1);
  const calendarId = mysheet.getRange('B2').getValue();
  const startdate1 = mysheet.getRange('B3').getValue(); //開始年月日
  const startDate = new Date(startdate1); //Date型開始年月日(時間はなし)
  const startdate2 = Utilities.formatDate(startDate, 'JST', 'yyyy-MM-dd');
  const sheetname2 = mysheet.getRange('B5').getValue(); //出力用シート名
  //出力シートを作成
  const mysheet2 = myfile.insertSheet(); //新シート
  //sheetname2と同じシート名があれば削除
  const isSheetExist = myfile.getSheetByName(sheetname2);
  if (isSheetExist) {
    myfile.deleteSheet(isSheetExist);
  }
  mysheet2.setName(sheetname2); //新シートの名前をsheetname2に

//題　1行目
  const mytitle = calendarId + 'のGoogleカレンダー';
  mysheet2.getRange(1,1).setValue(mytitle);
//題　2行目
  const mytitle2 = startdate2 + '〜 ' + ' の予定';
  mysheet2.getRange(2,1).setValue(mytitle2);
//データ取得日 3行目
  mysheet2.getRange(3,1).setValue('作成日：' + today2);

//カレンダーからイベントを取得
  const mycalendar = CalendarApp.getCalendarById(calendarId);
//取得データをシートに書き出し
//4行目　日付
  let row = 5; //書き出し開始は5行目
  let colnum = 7; //書き出し列数は7
  for (let i = 0;i < colnum;i++) {
    let myDate = addDaysToDate(startDate, i);
    let md = getGappi(myDate);
    let youbi1 = getYoubi(myDate);
    let eventTitles = getEventTitlesForDate(mycalendar, myDate);
    let cols1 = 1 + i;
    mysheet2.getRange(row, cols1).setValue(md);
    mysheet2.getRange(row + 1, cols1).setValue(youbi1);
    mysheet2.getRange(row + 2, cols1).setValue(eventTitles);
  }

  //外見整える。1〜７列目、5〜7行目
  const myrange1 = mysheet2.getRange('A5:G7');
  //外枠と縦線は実線、外枠以外の横線は点線
  myrange1.setBorder(true, true, true, true, true, true,'Black',SpreadsheetApp.BorderStyle.SOLID);
  myrange1.setBorder(null, null, null, null, null, true,'Black',SpreadsheetApp.BorderStyle.DOTTED);
  
  //5行目と6行目は垂直・水平とも中央揃え
  const myrange2 = mysheet2.getRange('A5:G6');
  myrange2.setHorizontalAlignment('center').setVerticalAlignment('center');
  //7行目
  const myrange3 = mysheet2.getRange('A7:G7');
  myrange3.setWrap(true); //セル端で折り返し
  //7行目は最も多い列に合わせてセルの高さを変更
  mysheet2.autoResizeRows(7,1);
  //水平は左揃え、垂直は上揃え
  myrange3.setHorizontalAlignment('left').setVerticalAlignment('top');
}
//////////
//Date型を受取り月日を返す
function getGappi(date) {
  const month = date.getMonth() + 1; //月は0から始まるため、+1
  const day = date.getDate();
  //月と日が一桁の場合は、頭に0を付けない
  let monthString = (month < 10) ? month.toString() : month;
  let dayString = (day < 10) ? day.toString() : day;

  return monthString + '/' + dayString;
}
///////////
//Date型を受取り曜日を返す
function getYoubi(date) {
  let youbi = '無';
  switch(date.getDay()){
    case 0 : 
      youbi = '日';
      break;
    case 1 :
      youbi = '月';
      break;
    case 2 :
      youbi = '火';
      break;         
    case 3 :
      youbi = '水';
      break;
    case 4 :
      youbi = '木';
      break;
    case 5 :
      youbi = '金';
      break;   
    case 6 :
      youbi = '土';
      break;
  }
  return youbi;
}
//////////
//一日のイベント名を返す。引数は、カレンダーオブジェクトと日付（Date型）
function getEventTitlesForDate(calendar, date) {
  //指定した日付のイベントを取得
  const events = calendar.getEventsForDay(date);
  //イベント名を取得し、複数あればカンマでつなげた文字列にする
  let eventTitles = events.map(function(event) {
    return event.getTitle();
  });
  return eventTitles.join(', ');
}
//////////
//Date型を受取り＊日後のDate型を返す 
function addDaysToDate(originalDate, daysToAdd) {
  let newDate = new Date(originalDate.getTime());
  newDate.setDate(newDate.getDate() + daysToAdd);
  return newDate;
}
```
表示用の月日と曜日を作るために、関数getGappiと関数getYoubiがあります。関数getEventTitlesForDateは、その日のイベント名を得るための関数です。関数addDaysToDateは、開始年月日startDateから、１日分ずつデータを得るときの、
日付を得るのに使います。
## ４．参考
[[GAS]水平方向・垂直方向のテキスト位置を取得・設定する方法](https://techuplife.tech/gas-ss-ralignment/)
テックアップライフ  
[[GAS]セルの枠線の位置・色・スタイルを設定する方法](https://techuplife.tech/gas-ss-rborder/)
テックアップライフ