문제

다음 두 필드가 있는 Google 양식이 있습니다.

  • 이메일 주소:- 텍스트 상자
  • 도구:- 라디오 버튼
    • 도구 1
    • 도구 2
    • 도구 3

사용자는 자신의 이메일 주소를 입력하고 도구를 선택한 다음 제출을 클릭합니다.다음 메시지가 나타나길 원합니다.

응답해 주셔서 감사합니다.이메일이 다음 주소로 전송되었습니다. 이메일 주소를 입력했습니다 다운로드 선택한 도구.

스크립트 편집기에 다음 코드 조각이 있습니다.

    function emailFormSubmission() {
        var form = FormApp.getActiveForm();//the current form
        var dest_id = form.getDestinationId(); //the destination spreadsheet where form responses are stored
        var ss = SpreadsheetApp.openById(dest_id);//open that spreadsheet
        var theFormSheet = ss.getSheets()[0]; //read the first sheet in that spreadsheet
        var row = theFormSheet.getLastRow(); //get the last row
        var emailid = theFormSheet.getRange(row,2,1,1).getValue();//get column 2 corresponding to the email id. column 1 is timestamp. so, skip that.
        var tool = theFormSheet.getRange(row,3,1,1).getValue();//get column 3 corresponding to the selected tool.
        form.setConfirmationMessage('Thanks for responding. An email has been sent to you '+ emailid + ' to download' + tool);
    }

나는 또한 triggers 실행하려면 -> emailFormSubmission, 이벤트 -> from Form , onFormSubmit.

일어나는 일은 다음과 같습니다.첫 번째 사용자('A')가 자신의 정보를 입력하고 제출을 클릭한다고 가정합니다.그가 입력한 정보가 올바르게 표시됩니다.두 번째 사용자('B')가 자신의 정보를 입력하고 제출을 클릭하면 A의 정보가 표시됩니다.세 번째 사용자('C')가 자신의 정보를 입력하고 제출을 클릭하면 B의 정보가 표시됩니다.스프레드시트가 업데이트되었기 때문에 문제가 "getlastrow()"에 있다는 것을 발견했습니다. ~ 후에 emailFormSubmission이 처리되었습니다.

위 코드에 어떤 문제가 있나요?이 문제를 어떻게 해결합니까?

업데이트

@wchiquito의 의견을 바탕으로 작동하도록 코드를 다음과 같이 변경했습니다.

function emailFormSubmission(e) {
    var form = FormApp.getActiveForm();
    //Check this link on how to access form response:
    //https://developers.google.com/apps-script/understanding_events?hl=en

    var responses = e.response;//e is of type formresponse.
    var emailid = responses.getItemResponses()[0].getResponse();
    var tool = responses.getItemResponses()[1].getResponse();
    Logger.log(emailid);
    Logger.log(tool);
    form.setConfirmationMessage('Thanks for responding. An email has been sent to  '+ emailid + '   with instructions to download ' + tool +'. If you do not find our email in your inbox, please check your spam folder');  
    Logger.log(form.getConfirmationMessage());
}
도움이 되었습니까?

해결책

이벤트이니 기억해두세요 On form submit (이벤트 이해)는 다음과 같은 구조를 갖는 매개변수를 받습니다.

  • 가치​​
  • 범위
  • 명명된 값​​

다음과 같이 할 수 있습니다:

function emailFormSubmission(e) {
    ...
    var row = e.range.getRow();
    ...
}

매개변수의 구조를 관찰하려면 다음 코드를 사용해 보세요. e:

function emailFormSubmission(e) {
    ...
    Logger.log(e);
    ...
}

업데이트

먼저 혼동을 드려 죄송합니다. Spreadsheet form submit event 실제로 사용하고 있을 때 Form submit event.

물론이죠, Form submit event 다음과 같은 구조를 가지고 있습니다:

  • 응답

유형의 객체 반환 FormResponse.

따라서 이벤트를 정의하면 다음과 같습니다. On submit form (Form submit event), 다음과 같은 작업을 수행할 수 있습니다.

function emailFormSubmission(e) {
  var itemResponses = e.response.getItemResponses();
  for (var i = 0, len = itemResponses.length; i < len; ++i) {
    Logger.log('Response #%s to the question "%s" was "%s"',
               (i + 1).toString(),
               itemResponses[i].getItem().getTitle(),
               itemResponses[i].getResponse());
  }
}

그러나 양식의 응답으로 전송된 데이터에 따라 설정된 확인 메시지는 명확하지 않은 것 같습니다. 메시지를 설정할 수 있지만 다음 응답이 아닌 경우 활성 응답에 대해서는 표시되지 않습니다.

다른 팁

내 첫 번째 추측은 바로 여기 두 줄입니다.

var emailid = theFormSheet.getRange(row,2,1,1).getValue();//get column 2 corresponding to the email id. column 1 is timestamp. so, skip that.
var tool = theFormSheet.getRange(row,3,1,1).getValue();//get column 3 corresponding to the selected tool.

당신이 전화할 때 getLastRow() 시트에 - 마지막 행이 표시됩니다.물론입니다. 하지만 이벤트 순서와 이러한 값이 처리되는 방식을 고려하면 +1, 최신 제출물을 얻으려면.현재 양식 확인 메시지를 업데이트하기 위해 코드가 실행될 때 한 행 뒤쳐져 있습니다.

따라서 코드를 다음과 같이 변경하십시오.

var emailid = theFormSheet.getRange(row+1,2,1,1).getValue();
var tool = theFormSheet.getRange(row+1,3,1,1).getValue();

내 생각에는 스프레드시트가 Google 서비스 중 가장 혼란스러운 것 같습니다.스프레드시트에서 값을 얻으면 다음과 같이 반환됩니다. [] 또는 [][] 전화할 때 범위가 무엇인지에 따라 getValues().하지만 getRange()sheet 인덱스 1에서 시작합니다(코드에서 더 쉽게 읽을 수 있도록).데이터가 전달되는 방식으로 인해 하나하나씩 오류가 발생하는 경우가 종종 있습니다.스프레드시트로 작업할 때 이 점을 명심하세요 :)

짧은 답변:원하는 것은 Google 양식으로는 할 수 없습니다.

설명:form.setConfirmationMessage()는 현재 활성 양식이 아닌 서버에 저장된 양식에 대한 확인 메시지를 설정합니다.예를 들어 form.setTitle()에도 동일하게 적용됩니다.활성 양식은 수정되지 않습니다.확인 메시지에 대해 다른 동작을 기대할 수 있지만 안타깝게도 그렇지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top