回答編集履歴

6

実行順序を一部変更

2024/04/08 06:01

投稿

YellowGreen
YellowGreen

スコア791

test CHANGED
@@ -20,8 +20,8 @@
20
20
  const properties = PropertiesService.getScriptProperties();
21
21
  const isExecuting = properties.getProperty('isExecuting');
22
22
  if (isExecuting === 'Yes') {
23
+ lock.releaseLock();
23
24
  console.log('実行中のスクリプトが重複しているので処理を中断しました。');
24
- lock.releaseLock();
25
25
  return;
26
26
  } else {
27
27
  properties.setProperty('isExecuting', 'Yes');

5

応急的な対応のコードに念のためスクリプトロックを導入しました。

2024/04/08 05:54

投稿

YellowGreen
YellowGreen

スコア791

test CHANGED
@@ -15,13 +15,18 @@
15
15
 
16
16
  ```JavaScript
17
17
  try {
18
+ const lock = LockService.getScriptLock(); // ←以下13行目まで追加
19
+ lock.tryLock(200);
18
- const properties = PropertiesService.getScriptProperties(); // ←以下8行目まで追加
20
+ const properties = PropertiesService.getScriptProperties();
19
21
  const isExecuting = properties.getProperty('isExecuting');
20
22
  if (isExecuting === 'Yes') {
23
+ console.log('実行中のスクリプトが重複しているので処理を中断しました。');
24
+ lock.releaseLock();
21
25
  return;
22
26
  } else {
23
27
  properties.setProperty('isExecuting', 'Yes');
24
28
  }
29
+ lock.releaseLock(); // ←この行まで追加
25
30
  const lastUpdated = properties.getProperty('lastUpdated'); // ←ここに移動して修正
26
31
  const calendarIds = getAllCalendarIds(); // ←ここに移動
27
32
  const currentTime = new Date(); // 以下同じ

4

通知の重複を防ぐ応急的な対応方法を追記しました。

2024/04/08 04:58

投稿

YellowGreen
YellowGreen

スコア791

test CHANGED
@@ -1,10 +1,50 @@
1
1
  ### 結論
2
- 通知の重複を防ぐための対応方法思い浮かびません。
2
+ 通知の重複を防ぐための応急的な対応方法しか思い浮かびません。
3
3
  トリガーを削除して再設定しても変わりませんでした。
4
4
 
5
5
  時間の経過で改善するかどうかも不明ですが、
6
6
  過去にもトリガーによる重複起動があったようですから、
7
7
  もしかするといつか改善するかもしれません。
8
+
9
+ ### 応急的な対応
10
+ このスクリプトが実行中であることを
11
+ プロパティーサービスに保存したisExecutingの値で確認できれば、
12
+ 後発のスクリプトは中断するように修正してみました。
13
+
14
+ ただし、カレンダーの予定が実際に同時期に複数更新された時に1つしか通知されなくなる可能性があります。
15
+
16
+ ```JavaScript
17
+ try {
18
+ const properties = PropertiesService.getScriptProperties(); // ←以下8行目まで追加
19
+ const isExecuting = properties.getProperty('isExecuting');
20
+ if (isExecuting === 'Yes') {
21
+ return;
22
+ } else {
23
+ properties.setProperty('isExecuting', 'Yes');
24
+ }
25
+ const lastUpdated = properties.getProperty('lastUpdated'); // ←ここに移動して修正
26
+ const calendarIds = getAllCalendarIds(); // ←ここに移動
27
+ const currentTime = new Date(); // 以下同じ
28
+ const notifiedEvents = getNotifiedEvents() || [];
29
+
30
+ // --- 中略 ---
31
+
32
+ // 通知されたイベントを記録
33
+ notifiedEvents.push(eventId);
34
+ }
35
+ }
36
+ }
37
+ }
38
+
39
+ // 通知されたイベントと最後の通知時間を保存
40
+ properties.setProperty('notifiedEvents', notifiedEvents.join(',')); // ←修正
41
+ properties.setProperty('lastUpdated', currentTime.toISOString()); // ←修正
42
+ properties.setProperty('isExecuting', 'No'); // ←追加
43
+ } catch (error) {
44
+ Logger.log('エラーが発生しました: ' + error);
45
+ }
46
+ }
47
+ ```
8
48
 
9
49
  ### 追試してみました。
10
50
  monitorAllCalendarsの最後の方(62行目)で、

3

説明の内容を質問者様の質問の更新に合わせました。

2024/04/08 04:06

投稿

YellowGreen
YellowGreen

スコア791

test CHANGED
@@ -1,16 +1,17 @@
1
1
  ### 結論
2
2
  通知の重複を防ぐための対応方法が思い浮かびません。
3
- 時間の経過で改善するかどうか不明
3
+ トリガーを削除して再設定して変わりませんした
4
4
 
5
+ 時間の経過で改善するかどうかも不明ですが、
5
- なお、質問者様がトリガーを2つ設定していことについて
6
+ 過去にもトリガーによ重複起動があったようですから
6
- sendSlackNotificationの方にトリガーを設定しても意味がない(カレンダーの予定の内容を受け取れない)ことは、
7
- エディタら手動実行してみると予定のタイトルが未定義とうエラーが発生することを確認できると思い
7
+ もしるといつか改善するかもしれせん
8
8
 
9
9
  ### 追試してみました。
10
10
  monitorAllCalendarsの最後の方(62行目)で、
11
11
  sendSlackNotification(eventDetails);
12
- を呼び出しているので、トリガーmonitorAllCalendarsの一つだけにして
12
+ を呼び出しているので、カレンダー更新時のトリガーmonitorAllCalendarsに設定して
13
13
  カレンダーにテスト用の予定を登録してみました。
14
+
14
15
  ### 結果
15
16
  私のところでは、
16
17
  予定のタイトル、開始時刻、終了時刻、場所、詳細が正常に記載された通知が

2

トリガーのIDについての理解が異なっていたので修正しました。

2024/04/08 03:38

投稿

YellowGreen
YellowGreen

スコア791

test CHANGED
@@ -18,20 +18,11 @@
18
18
 
19
19
  通知の内容は正常でしたが、質問者様と同じように2通の通知が届きました。
20
20
  エディタの実行数からログを確認したところ**トリガーによる起動のログが2回分**ありました。
21
-
22
- そこで、monitorAllCalendars関数のトリガーイベントのIDを確認するために、
23
- ```JavaScript
24
- function monitorAllCalendars(e) {
25
- console.log(e.triggerUid);
26
- ```
27
- のようにコードを追加してみたところ
28
- 2回の実行ログに表示されたトリガーのIDは2回とも同じでした。
29
-
30
- ということは、
31
21
  カレンダーを更新した際のトリガーが重複してスクリプトを起動していることになりますので、
32
22
  Googleサイドの不具合と受け止めるしかないのかもしれません。
33
- ユーザー側で対応するには二つの処理の中で、どちらかが二回目の起動だと判定する
23
+ ユーザー側で対応するには二つの処理の中で、どちらかが二回目の起動だと判定する方法現時点では思い浮かびません。
24
+
34
- 起動したトリガIDプロパティーサービスで保存、復元して自身のIDと同じかどうかチェックするということくらいでしょうか。それでもほぼ同時起動していようなので、処理が間に合わないと思い
25
+ 修正して e.triggerUid を取得して確認しましたが、全て同じIDにるので区別できせん
35
26
 
36
27
  slack通知
37
28
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2024-04-08/4da801f1-c549-4c9f-a65e-8fb84f3bb5bc.png)

1

説明を修正しました。

2024/04/08 03:25

投稿

YellowGreen
YellowGreen

スコア791

test CHANGED
@@ -1,13 +1,9 @@
1
1
  ### 結論
2
- 通知重複を防ぐための対応方法が思い浮かびません。
2
+ 通知重複を防ぐための対応方法が思い浮かびません。
3
3
  時間の経過で改善するかどうかも不明です。
4
4
 
5
- なお、仮に質問者様の通知の重複がトリガーを2つ設定していることによるものであれば
5
+ なお、質問者様がトリガーを2つ設定していることについて
6
- sendSlackNotificationの方にトリガーを設定しても意味がない(通知の内容を受け取れない)ので
6
+ sendSlackNotificationの方にトリガーを設定しても意味がない(カレンダー予定の内容を受け取れない)ことは、
7
- sendSlackNotificationのトリガーを削除してmonitorAllCalendarsのトリガーだけにすれば
8
- 解決すると思います。
9
-
10
- sendSlackNotificationの方にトリガーを設定しても意味がないことは、
11
7
  エディタから手動実行してみると予定のタイトルが未定義というエラーが発生することを確認できると思います。
12
8
 
13
9
  ### 追試してみました。