これまでのコメントのやりとりと、isBusinessDayやsetTrigger、delTriggerを使うようにサンプルスクリプトを示しているサイトなどを確認した上で回答しています。
このスクリプトは、
毎日特定の時間帯(!!)に起動するトリガー(日付ベースのタイマー)を設定して、土日祝日に関係なく営業開始時刻より前にsetTriggerを実行する。
setTriggerは、その日が平日ならmyFunctionを実行するための時刻(!!)に起動するトリガー(特定の日時)を作成する。
という手法で行われるのが通常のようです。
なぜこのようなことをしているかというと、
トリガーでは、毎日の起動は1時間の範囲がある時間帯の設定だけで、何時何分という時刻での起動は日付も含めた1回限りの設定しかできないからです。
1つのトリガーに毎日の時間帯を設定できるタイマーを毎日の午後5時から6時に設定すると、日によっては午後5時20分頃だったり、またある日は午後5時40分頃に起動することになり時刻がピッタリに定まらない。
1つのトリガーに1つの特定の日時を設定できるタイマーを午後5時0分に設定すると、遅くとも午後5時1分までには起動するが実行後のトリガーは無効になるので次回のトリガーを改めて設定しなければならない。
これを解決して毎日(平日に限る)特定の日時にmyFunctionを実行するための仕組みがsetTriggerでその都度特定の日時のトリガーを設定しておくという手法なので、少なくともsetTriggerの方は土日祝日も含めて毎日自動実行される必要があります。こちらは、時刻にこだわる必要がないので営業開始時刻より余裕をもった時間帯のトリガーで起動するように設定しておくと、myFunctionはsetTriggerが平日だけ設定する1回限りの特定の日時のトリガーで起動し、その1回限りのトリガーはsetTriggerが次回起動時に自動で消去してくれる。
ということを前提にしたスクリプトをお示しします。myFunctionの方はsetTriggerが設定する1回限りのトリガーでその都度起動するので、トリガーに関するコマンドは含まれていなくて構わないのでお示ししておりません。従前のものをそのままお使いください。当方が動作確認に使ったのは、ログを記録するだけのmyFunctionです。
「既存のトリガーは、全て削除」した上でsetTriggerを「時間主導型」>「日付ベースのタイマー」>「午前2時〜3時」などの時間帯を設定して保存します。myFunctionのトリガーは自動設定されるので手動では設定しません。
時間帯は午前1時〜2時や午前3時〜4時でも構わないので営業時刻より前で余裕をもった時間帯を設定します。
動作確認をしたい場合は、エディタから手動でsetTriggerを実行してmyFunctionのトリガーが設定されるかどうか確認してみてください。なお、午後5時以降(トリガーとして無効な時刻)に実行すると設定に関係なく1分後の時刻のトリガーが設定されてしまいますので速やかにmyFunctionのトリガーを削除するかエディタからdelTriggerを実行してください。
土日祝日の確認は、setTriggerTest()をエディタで選んで実行すると、isBusinessDayの戻り値とsetTriggerの振る舞いがわかるようにしましたので、いろいろと日付を設定してみてお試しください。
以下、スクリプトです。
javascript
1 //引数で渡された日が平日かどうかを
2 //真偽値(平日:真 休日:偽)で返す
3 function isBusinessDay ( _date ) {
4 //土日の判断
5 const week = _date . getDay ( ) ;
6 if ( week == 0 || 6 == week ) {
7 return false ;
8 }
9 //Googleカレンダー(日本の祝日)から祝日の判断
10 const calendar = CalendarApp
11 . getCalendarById ( 'ja.japanese#holiday@group.v.calendar.google.com' ) ;
12 const holidayEvents = calendar . getEventsForDay ( _date ) ;
13 if ( holidayEvents . length > 0 ) {
14 return false ;
15 }
16 return true ; //上2つに当てはまらなかったら平日
17 }
18 //この関数は、トリガーで「時間主導型」>
19 //「日付ベースのタイマー」>「午前0時から1時」に設定し
20 //土曜日曜祝日も含め日付が変わったら実行する。
21 //トリガーで実行されると、最初に古いトリガーを削除
22 //次にその日が平日なら新たなmyFunctionのトリガーを作成
23 //その日が休日なら削除のみを行って終了
24 function setTrigger ( ) {
25 //古いトリガーを削除
26 delTrigger ( ) ;
27 //今日の日付の特定の時刻を生成
28 const today = new Date ( ) ;
29 today . setHours ( 17 ) ;
30 today . setMinutes ( 00 ) ;
31 //今日が平日ならmyFunctionのトリガーを設定
32 if ( isBusinessDay ( today ) ) {
33 ScriptApp . newTrigger ( 'myFunction' )
34 . timeBased ( )
35 . at ( today )
36 . create ( ) ;
37 }
38 }
39 //'setTrigger'実行用のトリガーはそのままで
40 //'myFunction'実行用のトリガーがあれば全て削除する
41 function delTrigger ( ) {
42 const triggers = ScriptApp . getProjectTriggers ( ) ;
43 for ( const trigger of triggers ) {
44 if ( trigger . getHandlerFunction ( ) == 'myFunction' ) {
45 ScriptApp . deleteTrigger ( trigger ) ;
46 }
47 }
48 }
49 //isBusinessDayとsetTriggerの動作確認(実際には、ログを表示するだけです)
50 function setTriggerTest ( ) {
51 console . log ( 'テストを開始します。' ) ;
52 //古いトリガーを削除
53 // delTrigger();
54 console . log ( 'delTriggerの実行テスト' ) ;
55 //今日の日付の特定の時刻を生成
56 const today = new Date ( '2023/05/03' ) ; //←ここに試したい日付を入力
57 today . setHours ( 17 ) ;
58 today . setMinutes ( 00 ) ;
59 console . log ( 'today: ' + Utilities . formatDate ( today , 'JST' , 'M/d' ) ) ;
60 console . log ( 'isBusinessDayの返事は、' + isBusinessDay ( today ) ) ;
61 //今日が平日ならトリガーを設定
62 if ( isBusinessDay ( today ) ) {
63 // ScriptApp.newTrigger('myFunction')
64 // .timeBased()
65 // .at(today)
66 // .create();
67 console . log ( 'setTriggerの実行テスト' ) ;
68 }
69 console . log ( 'setTriggerは実行されましたか?' ) ;
70 }