[GAS] 스프레드 시트 onEdit ()는 "참조 대상"이 변경 되더라도 감지하지 않는 것 같습니다.

일어난 일



↓ 스프레드시트 A data 시트



A와는 다른 스프레드시트 B의 まとめ 시트가 이렇게↓


まとめ 시트의 A2 셀에는 아래와 같은 query 함수가 들어 있으며, 스프레드시트 A의 data 시트 중 B열이 「도쿄도」의 데이터만을 추출하고 있습니다.
=query(importrange("xxxxx","data!A2:C"),"where Col1 is not null and Col2 = '東京都'")

여기서 스프레드시트 B의 まとめ 시트가 업데이트되면 알림을 받기를 요청했지만 스프레드시트 A는 Google의 관할권이 아닙니다. (이므로 A의 스프레드 시트를 만질 수 없습니다)

따라서 스프레드시트 B의 업데이트를 감지하기 위해 스프레드시트 B에 다음 GAS를 설치합니다.
function onEdit(e) {
  Browser.msgBox("編集イベントきたよ");
}

이 상태에서 스프레드시트 B의 まとめ 시트를 손으로 편집하면(예를 들어 D1당 문자를 넣어 보면) "편집 이벤트 왔어"가 출력됩니다. 그래, 제대로 효과가 있다.

그러나 스프레드 시트 A의 data 시트에 다음과 같이 ID300 행을 추가하면 쿼리 함수 덕분에 스프레드 시트 B에는 300 개의 데이터가 추가되지만 이벤트는 점화됩니다. 그리고 메시지가 출력되지 않습니까?



참조 대상이 업데이트 되더라도 이벤트가 발화되지 않습니다.



좀 더 "작게"검증해 보겠습니다.

예를 들어 스프레드시트 C에 다음과 같은 시트를 만듭니다.
A2는 빈칸의 셀. B2는 =A2 식을 포함합니다.



또한 스프레드시트 C에 이런 GAS를 포함합니다.
function onEdit(e) {
  Browser.msgBox(e.range.getA1Notation());
}

그 후, A2에 「아아」를 입력하면 아래와 같이 됩니다.



시트로서는 「A3」도 편집? 업데이트? 되고 있습니다만, 이벤트로 취득할 수 있는 것은 「직접」편집된 「A2」만, 이라고 하는 것이군요.

그래? . . 예를 들어 importrange 라든지 query 라든지로, 대량으로 다른 시트를 참조하고 있으면(자) 힘들게 되는 것이군요.

덤 1


onEdit(e)e에 무엇이 들어 있는지는 아래에 적혀 있습니다.
Event Objects  |  Apps Script  |  Google Developers

그건 그렇고, onEdit()onChanged()의 차이점은
Google Spreadsheet 트리거의 '편집 시'와 '값 변경'의 차이점을 확인해 보았습니다. 아직 중학생 블로그

덤 2



onEdit이 어떤 때에 발화하는지는 아래에 적혀 있습니다.
Class SpreadsheetTriggerBuilder  |  Apps Script  |  Google Developers

Specifies a trigger that will fire when the spreadsheet is edited.

"스프레드 시트가 편집되었을 때 발화하겠습니다."라는 것입니다. 심지어 그것은 edit에 포함되지 않습니다 "같아요. 확실히 자신의 셀에는 「식」이 값으로서 들어가 있어, 그 식 자체는 바뀌지 않기 때문에 편집되어 있지 않다, , 입니다.

...라는 해석으로 좋은 것일까. 누군가 정보를 알고 있으면 알려주세요!

덤 3



이번 예에 들었던 건입니다만, 어쩔 수 없기 때문에 「스프레드시트 B」에 GAS를 넣어, 정기 실행해 「전회의 기동시와 비교해 변경이 있으면 통지한다,로 능가하기로 했습니다 .

Happy GAS Life를!

좋은 웹페이지 즐겨찾기