【営業でも分かる!】スプレッドシートに記載されたスケジュールを一気にGoogleカレンダーに反映

前回は、指定した列の日付(複数)から曜日を取得し、横の列のセルに記載する。。。
まで行いました。

まだの方は、まずこちらから御覧ください。

今回は、スプレッドシートに記載されたスケジュール⇒Googleカレンダーに反映
をやってみます。
※今までやってきた曜日を使って行わないのですが、営業の業務効率化に良いかと思いますので、ご紹介致します。

目次

今回の目標

スクリプト実行前

⇒実行(Ctrl+R)。。。
下記の様な表示 ↓↓↓↓

スクリプト実行後

実現のスクリプトと解説

下記をコンテナバインドスクリプトのスクリプトエディターにコピペして、
保存(Ctrl+S)
⇒スクリプトを実行(Ctrl+R)。。。

【前提】コンテナバインドスクリプトで作成しています。

//ファンクション名を「registCalendar」にする(registCalendarの部分は、何でも良いです)
function registCalendar(){

  // 紐付けるカレンダーを「.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];

    // コンテンツ(内容)の開始年月日(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);
  }
}

どうでしょうか?カレンダーに予定(発表内容)が表示されましたでしょうか?

まとめ

今回のスクリプトで重要なのは、いくつかありまして、

for(var i = 0; i < contents.length; i++) {
}

と、

var [number,person,year,day,dayOfWeek,startTime,endTime] = contents[i];
var startDateObje = new Date(day)

startDateObje.setHours(startTime.getHours());
startDateObje.setMinutes(startTime.getMinutes());

かと思います。

.lengthについて

for(var i = 0; i < contents.length; i++) {
}

前回は、「lastRow」の数だけfor文を回す処理でしたが、今回は、「length」を使ってコンテンツ(内容)の個数だけfor文を回す処理にしてみました。
結局、コンテンツの数は、行数-1(項目の行があるので、-1)なので、同じことなんですけどね。

for(var i = 0; i < lastRow-1; i++) {
}

2次元配列を分割代入し、そのまま変数として取得する。

var [number,person,year,day,dayOfWeek,startTime,endTime] = contents[i];

上記、変数「contents」は、下記の様な2次元配列となっていますので、
[[1.0, AAAチーム発表, 2022.0, Tue Jan 11 00:00:00 GMT+09:00 2022, 火曜日, Sat Dec 30 10:00:00 GMT+09:00 1899, Sat Dec 30 10:30:00 GMT+09:00 1899], ......, [7.0, GGGチーム発表, 2022.0, Mon Feb 28 00:00:00 GMT+09:00 2022, 月曜日, Sat Dec 30 10:00:00 GMT+09:00 1899, Sat Dec 30 10:30:00 GMT+09:00 1899]]
分割代入を行い、そのまま変数として取得します。。。。分かりづらいですよね。。。
イメージとしては、合っているか不明ですが、
1.var […]の[…]を変数として見て、そこにcontents[i]を「i」の数だけ繰り返し代入
2.その代入される際、また、入っている内容の順番に、
  number,person,year,day,dayOfWeek,startTime,endTimeの変数に代入される
イメージです。

「.setHours()」や「.setMinutes()」メソッドで、時間や分を日付情報に付加

var startDateObje = new Date(day)
startDateObje.setHours(startTime.getHours());
startDateObje.setMinutes(startTime.getMinutes());

最後の「.createEvent()」メソッドに引数を渡してあげる際に、日付+時間+分の情報が必要になり、それを「startDateObje」の変数にしようとしているわけですが、「startDateObje」にnew Date(day)だけ代入されていると日付しか「startDateObje」の変数に代入されないので、時間+分が足りません。そこで、「.setHours()」や「.setMinutes()」メソッドで、時間や分を日付情報に付加して、補ってあげた感じです。

では、終日の予定の場合はどうするのでしょう?次は、開始時間・終了時間の記載が無い終日予定の入れ方をやってみます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA