前回は、スプレッドシートに記載されたスケジュールを一気にGoogleカレンダーに反映する。。。
まで行いました。
まだご覧になられてない方は、まずこちらから御覧ください。
今回は、スプレッドシートに記載されたスケジュールの中で、時間の記載が無い場合
⇒Googleカレンダーの終日の箇所に表示させる。
をやってみます。
※前回の派生版とお考えください。
目次
今回の目標
⇒実行(Ctrl+R)。。。
下記の様な表示 ↓↓↓↓
実現のスクリプトと解説
下記をコンテナバインドスクリプトのスクリプトエディターにコピペして、
保存(Ctrl+S)
⇒スクリプトを実行(Ctrl+R)。。。
【前提】コンテナバインドスクリプトで作成しています。
//ファンクション名を「registCalendar2」にする(registCalendar2の部分は、何でも良いです)
function registCalendar2(){
// 紐付けるカレンダーを「.getOwnedCalendarById」を使って指定する
// IDは、登録したいメールアドレスで大丈夫です。
var calendar = CalendarApp.getOwnedCalendarById("○○○○@□□□□□.□□□");
//スプレッドシートの「アクティブなスプレッドシート全体」を取得し、それを「ss」に代入
var ss = SpreadsheetApp.getActiveSpreadsheet();
//「ss(アクティブなスプレッドシート全体)」の「アクティブなシートだけ」を「sheet」に代入
var sheet = ss.getActiveSheet();
//カレンダーに入力する内容が何件でも良い様に「sheet(アクティブなシート)」のコンテンツ最後行の位置を「lastRow」に代入
var lastRow = sheet.getLastRow();
//表を取得するために、範囲『2行1列目から、7行分(lastRowは1行目も含んだ数字を吐き出しているので-1する)、7列分』を指定し、取得。
var contents = sheet.getRange(2,1,lastRow-1,7).getValues();
//繰り返し文(for文)を使って、コンテンツ(内容)の個数の数だけ繰り返す処理を行う
for(var i = 0; i < contents.length; i++) {
// 「contents」は2次元配列なので、分割代入を行い、そのまま変数として取得します。contents[i]は、表の1行のデータ。
var [number,person,year,day,dayOfWeek,startTime,endTime] = contents[i];
// スタートタイム、もしくはエンドタイムのどちらかが空だった場合
if(startTime == "" ||endTime == ""){
// 終日予定が作成ができるメソッド「.createAllDayEvent」でカレンダーに担当と日付を表示させる
calendar.createAllDayEvent(person,day);
// 上記の条件に当てはまらない場合は、下記を実行
}else{
// コンテンツ(内容)の開始年月日(day)を「startDateObje」に代入
var startDateObje = new Date(day)
// 「setHours」を使用することで、その引数を「startDateObje」の時間として設定。
startDateObje.setHours(startTime.getHours());
// 「setMinutes」を使用することで、その引数を「startDateObje」の分数として設定。
startDateObje.setMinutes(startTime.getMinutes());
// コンテンツ(内容)の終了年月日(day)を「endDateObje」に代入
var endDateObje = new Date(day)
// 「setHours」を使用することで、その引数を「endDateObje」の時間として設定。
endDateObje.setHours(endTime.getHours());
// 「setMinutes」を使用することで、その引数を「endDateObje」の分数として設定。
endDateObje.setMinutes(endTime.getMinutes());
// 最後に「createEvent」に引数を入れて、カレンダーに登録する処理を行う
calendar.createEvent(person,startDateObje,endDateObje);
}
}
}
どうでしょうか?カレンダーの上部に予定が表示されましたでしょうか?
重要ポイント:
今回のスクリプトで重要なのは、、
if(startTime == "" ||endTime == ""){
}else{
}
かと思います。
ifの条件分岐・複数条件分岐
if (こちらに判別する条件式1を記載) {
条件式1が正しい(真)の時に実行する処理;
...;
}else{
条件式1では無い(偽)時に実行する処理;
...;
}
英語のifと同じように「もし~ならば…」となり、条件式1が「真」or「偽」で実行する処理が変わるようにできます。スプレッドシートの1月11日の行の処理の際は、開始時間・終了時間があるので、「条件式1」には当てはまらず、「else以降」の処理が実行され、1月17日も同じく「else以降」の処理が実行され、以降も同じです。ただ、2月22日に関しては、「条件式1」に当てはまるので「真」の方の処理が行われ、また2月28日は、開始時間・終了時間があるので、else以降の処理が実行され、、、と、繰り返します。
条件式が複数ある場合
if (こちらに1つ目の条件式1を記載) {
条件式1が正しい(真)の時に実行する処理;
...;
}else if(こちらに2つ目の条件式2を記載){
条件式2が正しい(真)の時に実行する処理;
...;
}else{
条件式1・2が正しく無い(偽)、つまり、どの条件式にも該当しなかった時に実行する処理;
...;
}
上記の様に、間に
}else if(条件式α){
を使用することで、条件式を増やしていくことが可能です。
今回、「==」や「||」の演算子も出てきておりますが、演算子に関しては、また改めてまとめページを作成しようと思っておりますので、お待ち下さい。
ありがとうございました。