programing

Google 스프레드 시트의 데이터를 사용하여 Google 양식을 '미리 채울'수 있습니까?

nasanasas 2020. 11. 28. 09:36
반응형

Google 스프레드 시트의 데이터를 사용하여 Google 양식을 '미리 채울'수 있습니까?


Google 스프레드 시트의 특정 데이터로 Google 양식을 '미리 채우는'방법을 찾고 있습니다. 양식에는 모든 사람에게 동일한 '표준'질문이 있지만 처음 두 질문의 데이터는 기존 Google 스프레드 시트의 고유 한 데이터로 '미리 ​​채워집니다'. 데이터는 기존 스프레드 시트의 이메일 주소를 기반으로 고유합니다.

소스 스프레드 시트 예

Col 1       Col 2        Col 3 
email       name         birthday  
@mike       Mike Jones   May 9th 1975  
@jim        Jim Smith    April 19th 1985

양식 예 1

질문 1- Google 스프레드 시트의 데이터 (Mike Jones)미리 채워져 있습니다.

질문 2- Google 스프레드 시트의 데이터 (1975 년 5 월 9 일)로 미리 채워져 있습니다.

질문 3-비어 있음 (사용자 응답 대기 중)

질문 4-비어 있음 (사용자 응답 대기 중)


양식 예 2

질문 1- Google 스프레드 시트의 데이터 (Jim Smith)로 미리 채워져 있습니다.

질문 2- Google 스프레드 시트의 데이터 (1985 년 4 월 19 일)로 미리 채워져 있습니다.

질문 3-비어 있음 (사용자 응답 대기 중)

질문 4-비어 있음 (사용자 응답 대기 중)


이것이 할 수 있는지 아는 사람이 있습니까? 그렇다면, 어떤 도움이나 지시도 대단히 감사하겠습니다.

미리 감사드립니다!
토드


드라이브 양식 문서에 설명 된대로 양식 편집기 내에서 미리 채워진 양식 URL을 만들 수 있습니다 . 예를 들어 다음과 같은 URL로 끝납니다.

https://docs.google.com/forms/d/--form-id--/viewform?entry.726721210=Mike+Jones&entry.787184751=1975-05-09&entry.1381372492&entry.960923899

buildUrls ()

이 예에서 질문 1 "Name"은 ID가 726721210이고 질문 2 "Birthday"는 787184751입니다. 질문 3과 4는 비어 있습니다.

다음과 같이 UI를 통해 제공된 URL을 템플릿으로 조정하여 미리 채워진 URL을 생성 할 수 있습니다.

function buildUrls() {
  var template = "https://docs.google.com/forms/d/--form-id--/viewform?entry.726721210=##Name##&entry.787184751=##Birthday##&entry.1381372492&entry.960923899";
  var ss = SpreadsheetApp.getActive().getSheetByName("Sheet1");  // Email, Name, Birthday
  var data = ss.getDataRange().getValues();

  // Skip headers, then build URLs for each row in Sheet1.
  for (var i = 1; i < data.length; i++ ) {
    var url = template.replace('##Name##',escape(data[i][1]))
                      .replace('##Birthday##',data[i][2].yyyymmdd());  // see yyyymmdd below
    Logger.log(url);  // You could do something more useful here.
  }
};

이것은 충분히 효과적입니다. 미리 채워진 URL을 각 사람에게 이메일로 보낼 수 있으며, 그들은 이미 몇 가지 질문이 채워져있을 것입니다.

betterBuildUrls ()

무차별 대입을 사용하여 템플릿을 만드는 대신 프로그래밍 방식으로 함께 조합 할 수 있습니다. 이는 템플릿 변경을 기억할 필요없이 코드를 재사용 할 수 있다는 장점이 있습니다.

양식의 각 질문은 항목입니다. 이 예에서는 설명한대로 양식에 4 개의 질문 만 있다고 가정합니다. 항목 [0]은 "이름", [1]"생일"등입니다.

제출하지 않을 양식 응답을 생성 할 수 있습니다. 대신 미리 채워진 양식 URL을 얻기 위해서만 양식을 부분적으로 완성합니다. Forms API는 각 항목의 데이터 유형을 이해하므로 날짜 및 기타 유형의 문자열 형식을 조작하지 않아도되므로 코드가 다소 단순화됩니다.

( 편집 : Google 양식 확인란을 미리 채우는 방법에 더 일반적인 버전이 있습니까? )

/**
 * Use Form API to generate pre-filled form URLs
 */
function betterBuildUrls() {
  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getSheetByName("Sheet1");
  var data = ss.getDataRange().getValues();  // Data for pre-fill

  var formUrl = ss.getFormUrl();             // Use form attached to sheet
  var form = FormApp.openByUrl(formUrl);
  var items = form.getItems();

  // Skip headers, then build URLs for each row in Sheet1.
  for (var i = 1; i < data.length; i++ ) {
    // Create a form response object, and prefill it
    var formResponse = form.createResponse();

    // Prefill Name
    var formItem = items[0].asTextItem();
    var response = formItem.createResponse(data[i][1]);
    formResponse.withItemResponse(response);

    // Prefill Birthday
    formItem = items[1].asDateItem();
    response = formItem.createResponse(data[i][2]);
    formResponse.withItemResponse(response);

    // Get prefilled form URL
    var url = formResponse.toPrefilledUrl();
    Logger.log(url);  // You could do something more useful here.
  }
};

yymmdd 함수

미리 채워진 양식 URL의 모든 날짜 항목은 다음 형식이어야합니다 yyyy-mm-dd.. 이 도우미 함수는 변환을 처리하는 새 메서드로 Date 개체를 확장합니다.

When reading dates from a spreadsheet, you'll end up with a javascript Date object, as long as the format of the data is recognizable as a date. (Your example is not recognizable, so instead of May 9th 1975 you could use 5/9/1975.)

// From http://blog.justin.kelly.org.au/simple-javascript-function-to-format-the-date-as-yyyy-mm-dd/
Date.prototype.yyyymmdd = function() {
  var yyyy = this.getFullYear().toString();                                    
  var mm = (this.getMonth()+1).toString(); // getMonth() is zero-based         
  var dd  = this.getDate().toString();             

  return yyyy + '-' + (mm[1]?mm:"0"+mm[0]) + '-' + (dd[1]?dd:"0"+dd[0]);
};

참고URL : https://stackoverflow.com/questions/20108511/is-it-possible-to-prefill-a-google-form-using-data-from-a-google-spreadsheet

반응형