0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2024-08-19

1.目的

前回、開始日・終了日を指定して、Googleカレンダーのその間の予定をスプレッドシートに書き出すものを作りました(【GAS】Googleカレンダーのデータをスプレッドシートに書き出す)。
今回は、開始日を指定して、その日を含め1週間分の予定(イベント)をスプレッドシートに書き出します。1週間毎に予定表を作る場合、これを元に作ったり、予定表にコピペしたりするのに使えます。スプレッドシートのコンテナバインドプロジェクトです。

2.使い方・画面

シートmainとして、カレンダーID、開始日、出力シート名を入力するシートを作っておきます。出力シートと同じ名前のシートがあれば、削除され新しいシートが作られます。mycalendar2を実行するボタンも作ってあります。
Screenshot20240819_1.png
出力シートには、5行目に月日、6行目に曜日、7行目その日の予定が書き出されます。複数の予定がある場合は、カンマでつなげて表示します。
Screenshot20240819_2.png

3.スクリプト

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〜7列目、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から、1日分ずつデータを得るときの、
日付を得るのに使います。

4.参考

[GAS]水平方向・垂直方向のテキスト位置を取得・設定する方法
テックアップライフ
[GAS]セルの枠線の位置・色・スタイルを設定する方法
テックアップライフ

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?