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