IT-Swarm.Net

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-공백 (사용자 응답 대기 중)


이것이 가능한지 아는 사람이 있습니까? 그렇다면 도움이나 지시를 주시면 감사하겠습니다.

미리 감사드립니다!
토드

62
Mr. B

드라이브 양식 설명서 에 설명 된대로 양식 편집기에서 미리 채워진 양식 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, "이름"의 ID는 726721210이고 질문 2 인 "생일"은 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 개체를 확장합니다.

스프레드 시트에서 날짜를 읽을 때는 데이터 형식을 날짜로 인식 할 수있는 한 javascript Date 객체가 생깁니다. (예를 인식 할 수 없으므로 May 9th 1975 대신 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]);
};
91
Mogsdad