1.目的
今まで、Googleカレンダーの予定をスプレッドシートに書き出すものを作りました(【GAS】Googleカレンダーの一週間の予定をスプレッドシートに書き出す
、【GAS】Googleカレンダーのデータをスプレッドシートに書き出す)。今回は、スプレッドシートに予定をデータを入力し、それをカレンダーに取り込むものを作りました。スプレッドシートのコンテナバインドプロジェクトです。
2.使い方・画面
シートmainとして、カレンダーID、開始日、書き出し用のシート名を入力するシートを作っておきます。関数to_mycalendarを実行するボタンも作ってあります。
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分になったりするので、年月日と時刻をくっつけるためにこの関数を使います。