2014-11-20 1 views
1

양식을 제출하고 양식 데이터를 이메일에 포함 할 때 이메일을 통해 누군가에게 알리는 것에 대한 많은 게시물을 읽었으나 이미하고있는 것에 대한 업데이트를 식별하고 싶습니다 정보를 이메일에 넣고 보냈습니다. 최신 타임 스탬프를 확인하고 해당 항목을 가져와이를 수행 할 것이라고 생각합니다. 그러나, 극히 제한된 프로그래밍 기술은 내가 대답을 해결할 수 없다는 것을 의미합니다.Google 양식 제출이 업데이트 될 때 이메일 보내기

답변

2

나는 트릭의 가방에 이런 기능이 있습니다.

이 함수는 수신 한 이벤트 객체를 사용하는 양식 제출을 위해 formSubmitted(e) 트리거 함수가 있다고 가정합니다. 추측 하듯이, 가장 최근의 업데이트를 식별합니다. 그런 다음 시뮬레이트 된 양식 제출 이벤트를 작성하고 양식 제출 트리거 기능을 호출합니다.

onChange()을 스프레드 시트 변경시 트리거 할 수 있습니다.

/** 
* Sometimes, Google Apps Script sucks. This is one of those times. 
* If a user updates previously submitted form data by using the "edit" link, 
* that data will be updated in the Form Responses sheet. Unfortunately, 
* that will NOT generate a spreadsheet form submission event. (See explanation: 
* https://code.google.com/p/google-apps-script-issues/issues/detail?id=2969#c12) 
* 
* Observation: a form edit shows up as a change, with type of "OTHER", and source 
* of a spreadsheet with activeSheet="Form Responses" and activeRange="A1". We 
* will use that information to limit when we force our normal form-submission 
* handler to run. Unfortunately, the event doesn't tell us which row changed, 
* but that should be the one with the most recent timeStamp. 
*/ 
function onChange(e) { 
    if (e.changeType !== "OTHER") return; 
    if (e.source.getActiveSheet().getName().indexOf("Form Responses") === -1) return; 
    if (e.source.getActiveRange().getA1Notation() !== "A1") return; 

    // Find latest form submission 
    var sheet = e.source.getActiveSheet(); 
    var timeStamps = sheet.getRange("A2:A").getValues(); 

    // Determine most recent date 
    var max = Math.max.apply(null,transpose(timeStamps)[0]); 
    var properties = PropertiesService.getDocumentProperties(); 
    var lastMax = properties.getProperty("maxDate"); 
    if (lastMax && max.toString() === lastMax) return; // Avoid changes triggered by updates from onChange function 
    Logger.log("onChange() thinks there's been a form edit. e="+JSON.stringify(e)); 
    properties.setProperty("maxDate", max.toString()); 
    var maxDate=new Date(max); 

    // Then find the sheet row that contains it 
    for (var row=0,found=false;row<timeStamps.length&&!found;row++) { 
    if (timeStamps[row][0] && timeStamps[row][0].getTime() === maxDate.getTime()) { 
     found = true; 
     break; 
    } 
    } 

    if (!found) { 
    // We're blind... recalc everything 
    // TODO 
    } 
    else { 
    // Trigger the submission event for this row 
    row += 2; // adjust for offset into sheet rows 
    var dataRange= sheet.getDataRange(); 
    var data = dataRange.getValues(); 
    var headers = data[0]; 
    var response = data[row]; 
    var respRange = dataRange.offset(row-1, 0, 1, dataRange.getLastColumn()); 

    // Build event object with range, values and namedValues filled in 
    var values = respRange.getValues()[0]; 
    var namedValues = {}; 
    for (var h in headers) { namedValues[headers[h]] = [values[h]]; } 
    var e = { range: respRange, 
       values: values, 
       namedValues: namedValues 
      }; 
    formSubmitted(e);  // Simulate event 
    } 
} 
+0

것 같습니다. 훌륭한 해결책. 나는 하나의 답을 정확하게 표시 할 수있을 것만 같지만 두 답은 모두 효과가 있었고 아마도 그 이점과 단점을 가지고있었습니다. – Greig

3

Google App Script를 사용하여 양식 응답이 저장되는 스프레드 시트를 열 수 있습니다. 도구 -> 스크립트 편집기 -> 스크립트 편집기가 열리 며 아래 기능을 복사하십시오.

양식 제출시이 함수를 호출하는 트리거를 작성하십시오. 자원 -> 현재 프로젝트의 트리거 -> '스프레드 시트에서'를 선택하고 '양식 제출시'를 선택하고 트리거를 작성하십시오.

function sendEmailNoti(e) { 
    var timeStamp = e.values[0]; 
    var userEmail = e.values[1]; 
    var products = e.values[2]; 

    var subject = "New Subscription Request"; 
    var email = "[email protected]"; 
    var message = "User email : " + userEmail + "<BR>Products opted : " + products + "<BR>Timestamp : " + timeStamp; 


    MailApp.sendEmail({ 
    to: email, 
    subject: subject, 
    htmlBody: message 
    }); 
} 
+0

감사합니다. 이것은 작동하는 간단한 해결책 인 것 같습니다. 변경되지 않은 이메일에 정보가 포함될 수 있습니까? E.G. 편집이 이루어지면 userEmail은 그대로 유지되지만이 경우 이메일에 메시지가 나타나지 않습니다. 또한, URL에 메시지 편집 (getEditUrl()) 형식을 사용할 수 있습니까? – Greig

0

이 문제는 약간 다르게 처리되었습니다. 새 트리거를 만드는 대신 양식 제출 트리거 자체를 수정하여 양식 응답 대신 스프레드 시트에서 각 키의 값을 선택합니다.

수정 된 코드는 내가이 실제로 작동합니까 것으로 나타났습니다 작업에 자신을 적용했는지 이제이

// Include a copy of all responses 
for (var keys in columns) { 
    var key = columns[keys]; 
    message += key + ' :: '+ sheet.getRange(resultUrls.length+1, (data[0].indexOf(key)+1)).getValues() + "<br />"; 
} 
관련 문제