>source

양식을 제출할 때 내가 작성한 스크립트가 중복 이메일을 보내는 문제가 있습니다. 스프레드 시트를 열 때 스크립트가 실행되는 경우도 있습니다. 양식을 제출할 때 스크립트를 실행하도록 하나의 트리거 만 설정했으며 시트에 대한 편집 권한이있는 유일한 트리거입니다. 스크립트 프로젝트를 모두 삭제하고 새 프로젝트를 만들려고 시도했지만 문제가 해결되지 않았습니다. 내 스크립트에 이상한 것이 있는지 확실하지 않지만 여기에 있습니다 :

function sendEmails() {
  var sheet = SpreadsheetApp.getActive().getSheetByName('Raw Data'); // Gets Raw Data Sheet
  var lastRow = sheet.getLastRow(); // Gets last row of sheet everytime the form is submitted
  var lastColumn = sheet.getLastColumn(); // Gets last column of sheet everytime the form is submitted
  var value = sheet.getRange(lastRow,1,lastRow,lastColumn).getValues().toString(); 
  var comments = sheet.getRange(lastRow, 41).getValue().toString(); // Gets additional comments from inspection form submitted
  if (value.indexOf("NOT OK") > -1) {
    MailApp.sendEmail({
    to: "test@test.com",
    subject: 'Machine Issue',
    htmlBody: "An inspection of the xyz machine has returned issues: " + "<br/><br/>"
      + "<b>" + comments + "</b>" + "<br/><br/>" +
      " Click " + '<a href="https:goo.gl/ahGbGu&^"> <b>HERE</b></a>' 
      + " to see the last inspection report.",
    });
  } // Produces email based on defined parameters.
}

또한 트리거를 삭제하고 작동하지 않은 새 트리거를 설정하려고 시도했습니다.


  • 답변 # 1

    실행 로그를 확인하십시오. 여러 번 실행했지만 양식 응답 행이 하나 인 경우 양식 제출 트리거의 알려진 버그입니다. 이를 해결하는 유일한 방법은 스크립트 잠금을 사용하는 것입니다.

    좋아요 :

        SpreadsheetApp.flush();
         var lock = LockService.getScriptLock();
      try {
        lock.waitLock(15000); // wait 15 seconds for others' use of the code section and lock to stop and then proceed
         } catch (e) {
            Logger.log('Could not obtain lock after 30 seconds.');
            return HtmlService.createHtmlOutput("<b> Server Busy please try after some time <p>")
            // In case this a server side code called asynchronously you return a error code and display the appropriate message on the client side
            return "Error: Server busy try again later... Sorry :("
         }
    START NORMAL CODE HERE
    
    

    이것이 실제로 문제가되는 스크립트는 하나 뿐이지 만 양식 제출 당 최대 6 개의 실행이 가능하고 scriptlock은 스크립트를 잠그는 가장 깔끔한 방법입니다. 코드 자체가 15 초 미만이면 대기 잠금 시간이 줄어들어 추가 사본이 더 빨리 포기됩니다. 이 방법을 사용하면 여전히 실행 로그에 여분의 사본이 표시되지만 길이는 15 초입니다. 그들이 이런 식으로 잡히고 살해되는 것을 보는 것은 매우 만족 스럽습니다.

  • 답변 # 2

    이 줄에 문제가 있습니다 :

    var value = sheet.getRange(lastRow,1,lastRow,lastColumn).getValues().toString();
    
    
    lastRow가 20이라고 가정 해 봅시다. 그러면이 코드는 마지막 행과 다음 19 행의 값을 가져옵니다. 세 번째 매개 변수는 행 수이고 네 번째 매개 변수는 열 수입니다.

    이벤트 객체를 함수에 전달하고 마지막 줄을 가져 가지 않고 e.values를 사용하는 것이 좋습니다. 여러 양식을 차례로 제출하면 실제로 잘못된 데이터가 표시 될 수 있습니다.

    이 라인에도 문제가 있습니다 :

    htmlBody: "An inspection of the xyz machine has returned issues: " + "<br/><br/>"
          + "<b>" + comments + "</b>" + "<br/><br/>" +
          " Click " + '<a href="https:goo.gl/ahGbGu&^"> <b>HERE</b></a>' 
          + " to see the last inspection report.",
        });
    
    

    htmlBody 매개 변수 끝에있는 쉼표를 제거해야합니다.

    이 코드를 사용해보십시오 :

    function sendEmails(e) {
      var value=e.values.toString();
      var comments=e.values[40]; 
      if (value.indexOf("NOT OK") > -1) {
        var html="An inspection of the xyz machine has returned issues: "; 
        html+="<br/><br/>" + "<b>" + comments + "</b>" + "<br/><br/>" + " Click " 
        html+='<a href="https:goo.gl/ahGbGu&^"> <b>HERE</b></a>' + " to see the last inspection report.";
        MailApp.sendEmail({to: "test@test.com",subject: 'Machine Issue',htmlBody: html});
        //Logger.log(html);
      } 
    }
    
    

    양식 제출 이벤트 객체

    @J에 따르면 이것으로 조금 더 놀았습니다. G. 여러 트리거를 반환하는 onFormSubmit 트리거에 문제가 있습니다. FormSubmit 트리거를 로그온하는 데 사용하는 다음 코드를 사용하여 테스트 상황을 해결했습니다.

    function testFormSubmission(ev) {
      var lock=LockService.getUserLock();
      try{
        if(ev.values && !ev.values[1]){throw('Spurious Returns Error');}
          if(lock.tryLock(10000)) {
          var ss=SpreadsheetApp.getActive();
          var sh=ss.getSheetByName('LogSheet');
          var tA=[Utilities.formatDate(new Date(), Session.getScriptTimeZone(),"d/M/yyyy HH:mm:ss")];
          tA=tA.concat(ev.values);
          tA.splice(tA.length-1,1,ev.triggerUid,ev.range.rowStart,ev.range.columnEnd,JSON.stringify(ev.values));
          sh.appendRow(tA);
          lock.releaseLock();  
        }
      }
      catch(error){
        console.error(error);
        return;
      }
    }
    
    

관련 자료

  • 이전 python - 셀의 시작과 끝 표시
  • 다음 javascript - 객체 내부의 배열을 단일 객체로 분리