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カレンダーに予定を入力、スプレッドシート使用

Posted at

1.目的

今まで、Googleカレンダーの予定をスプレッドシートに書き出すものを作りました(【GAS】Googleカレンダーの一週間の予定をスプレッドシートに書き出す
【GAS】Googleカレンダーのデータをスプレッドシートに書き出す)。今回は、スプレッドシートに予定をデータを入力し、それをカレンダーに取り込むものを作りました。スプレッドシートのコンテナバインドプロジェクトです。

2.使い方・画面

シートmainとして、カレンダーID、開始日、書き出し用のシート名を入力するシートを作っておきます。関数to_mycalendarを実行するボタンも作ってあります。
Screenshot20240819_3.png

3.スクリプト

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型を2つ受取り、1つ目の日付、2つ目の時分を持つ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型を2つ受取り、1つ目の年月日に2つ目の時分をいれて一つのDate型を返します。スプレッドシートでは年月日と時刻を別に記述しますが、時刻を10:30と入力しておくと、1899年12月30日10時30分になったりするので、年月日と時刻をくっつけるためにこの関数を使います。

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?