Google Spreadsheet 수정 시 이메일로 알림받기

2024. 5. 9. 00:11잡기술

1. 스프레드시트에서 App script 실행

2. 코드작성

function onEdit(e) {
    var userEmail = Session.getActiveUser().getEmail(); // 수정한 사용자 이메일 주소 가져오기
    var anonymous = !userEmail; // 이메일이 빈 경우 anonymous로 간주
  
    var range = e.range; // Range that was edited
    var sheetName = range.getSheet().getName(); // 수정 된 시트
    var editedContent = range.getValue(); // 수정 된 내용

    var subject = 'Sheet is Edited';
    var body = `- sheet: "${sheetName}"\n`;
    if (anonymous) {
      subject += ` by ANONYMOUS.`
      body += `- User: anonymous\n- Cell: ${range.getA1Notation()}\n- Contents: "${editedContent}".`;
    } else {
      subject += ` by ${userEmail}`
      body += `- User: ${userEmail}\n- Cell: ${range.getA1Notation()}\n- Contents: "${editedContent}".`;
    }
  if (userEmail != 'My-mail@My_mail.com'){
    MailApp.sendEmail({
      to: "My-mail@My-mail.com", // 알람을 보내고자하는 메일 주소
      subject: subject,
      body: body
    });
  }
}

 

  • 코드는 .GS 확장자로 되어있음. GS는 Google 애플리케이션 스크립트로 '자바 스크립트'를 기반으로 온라인 Google 제품에서 작업을 자동화에 사용되는 스크립트임.
  • 내가 수정 한 경우에도 메일을 받아야하기 때문에 수정자 메일 주소가 내 메일과 일치하면 메일 보내지 않도록 함.

 

3. 트리거 설정

  • 스크립트 파일을 저장
  • 왼쪽 바에서 '트리거'로 이동
  • '트리거 추가' 클릭
  • 이벤트 유형 선택 '수정 시' & 실행할 함수를 onEdit으로 설정

 

 

4. 테스트 결과

ENJOY--




여담.

시크릿 모드로 접속하여 볼 경우 메일이 보내지지 않는 문제가 생김

 

그래서 다음과 같이 수정함.

function onEdit(e) {
  var userEmail = Session.getActiveUser().getEmail();
  var anonymous = !userEmail;
  
  try{
    var range = e.range;
    var sheetName = range.getSheet().getName();
    var editedContent = range.getValue();

    // Modify the email content based on user status
    var subject = 'Sheet Edited';
    var body = `- sheet: "${sheetName}"\n`;
    if (anonymous) {
      subject += ` by ANONYMOUS.`
      body += `- User: anonymous\n- Cell: ${range.getA1Notation()}\n- Contents: "${editedContent}".`;
    } else {
      subject += ` by ${userEmail}`
      body += `- User: ${userEmail}\n- Cell: ${range.getA1Notation()}\n- Contents: "${editedContent}".`;
    }
  }
  catch(error){
    var subject = 'Sheet Edited by Private? or Error';
    var body = `alert: ${error.message} `;
    MailApp.sendEmail({
      to: "My-mail@My_mail.com",
      subject: subject,
      body: body
    });
  }
  if (userEmail != 'My-mail@My_mail.com'){
    MailApp.sendEmail({
      to: "My-mail@My_mail.com",
      subject: subject,
      body: body
    });
  }
}

 

시크릿 모드로 접속하여 수정하는 경우 getEmail 과 e.range 에서 값을 정상적으로 가져오지 못한다.

원래는 이 경우 권한을 검토하는 코드를 추가 해야겠지만...

 

내가 수정이 일어남을 인지하기 위한 용도 이기 때문에 강제 실행 코드로 메일을 보내도록 하였다.

시크릿 모드일지라도 onEdit 이벤트는 정상적으로 실행되기 때문에 상관없다.