こんにちは、おかちゃんせんせいです!
隔週水曜日の夜にオンライン講座があり、毎回手動でMeetを作成して、LINEでURLをお知らせしていたのですが、、、
毎回手動でやるのが手間だし、時々直前になるまでお知らせを忘れてアタフタすることも。
そこで、指定した特定の週・曜日にMeetのURLを作成して、カレンダー登録をするGASを組もうと決めました。
そのための最初の関門として、
指定した特定の週・曜日の日付データをどのように取得するか?
でした。
目次
ポイントは2つ
最初の関門を突破するために考えなくてはいけない判別のポイントは下記2つ。
- 指定する曜日
- 指定する第N週
まず、①の指定する曜日については、getDateで曜日のインデックス番号が取得できるので、それで判別可能です。
たとえば、自分の場合は水曜日に指定したかったので、3を指定。
それ以外の場合は除外するという処理をすればOKということになります。
getDateメソッドで取得するインデックス番号
0:日曜日、1:月曜日、2:火曜日、3:水曜日、4:木曜日、5:金曜日、6:土曜日
①はそれで問題ないですが、悩んだのは――
指定する週をどうやって絞り込むのか?
ということ。
ネットで検索してみても、
1か月間の中で指定した曜日の日付データを格納した配列から、最終的に指定する週のインデックス番号から絞り込む方法しか見つからず。
自分の場合には、一年を通して指定する条件の日付データを取得したかったため、ネットで紹介されている情報では不完全。
「できるだけシンプルに」
と考えて思いついた方法は、for文で繰り返し処理をする中で月単位で何週目かを変数cntでカウントする方法でした。
そして、①も同様ですが、
指定するかどうかを判別するためにフラグを用意して、includesメソッドで指定する週や曜日が含まれているかどうかを判別して条件分岐させることにしました。
サンプルコード
以上の内容を踏まえて、サンプルコードは下記の通りになります。
コピーしました!
/**
* 指定する特定の週・曜日の日付データを取得するカスタム関数
*/
function getSpecifiedDate() {
let date = new Date();
let year = date.getFullYear();
let days = [];
let select = [2,4]; // 指定する第N週
let dayOfWeek = [3]; // 指定する曜日のインデックス番号
for (let m = 1; m <= 12; m++){
let eomonth = new Date(year, m, 0); // m月の月末を取得
let end = eomonth.getDate(); // m月の月末日を取得
let cnt = 1; // 何週目なのかをカウントする変数
for (let d = 1; d <= end; d++) {
let tmpDate = new Date(year, m-1, d);
let flgW = dayOfWeek.includes(tmpDate.getDay()); // 指定する曜日のインデックス番号が含まれているのか
// 指定曜日以外の処理はここまで
if (!flgW) continue;
let flgS = select.includes(cnt); // 指定する週かどうか
// 指定する週であれば、days配列に追加する
if (flgS){
days.push(tmpDate);
console.log(`第${cnt}週目:${Utilities.formatDate(tmpDate,"JST","yyyy年MM月dd日")}`);
}
cnt += 1;
}
}
}
今回の要望としては、曜日は水曜日だけに絞っていたため配列にする必要まではなかったですが、複数の曜日にも対応できるようにあえて配列にしてあります(変数dayOfWeek)。
もし、月曜日と水曜日を指定したい場合には、dayOfWeekを[1,3]とすれば曜日を複数指定が可能になります。
特定の週・曜日の日付データが取得できれば、あとはそれをスプレッドシートに反映させるなり、他の処理に連携させるなりいくらでも応用が可能になります。
今回の情報が何かお役に立てば幸いです。
最後まで読んでいただき、ありがとうございました!