태그 보관물: google-apps-script

google-apps-script

Google 설문지의 ‘목록에서 선택’스타일 질문을 데이터 목록 (예 : 스프레드 시트)에 연결하는 방법이 있습니까? 세션에 참석 한

양식의 “목록에서 선택”스타일 질문을 데이터 목록 (예 : 스프레드 시트)에 연결하는 방법이 있습니까?

이는 새로운 옵션이 스프레드 시트의 목록에 추가되거나 목록을 호스팅 할 수있는 모든 위치에서 향후 양식에서 선택할 수있는 옵션으로 자동 표시됨을 의미합니다.

제 경우에는 양식을 작성하는 응답자가 특정 자원 봉사 세션에 참석 한 자원 봉사자 목록 (각 이름을 개별적으로 입력하지 않고)에서 자원 봉사자를 선택할 수 있지만, 자원 봉사자가 산발적으로 참여하기 때문에 매번 새 옵션을 수동으로 추가하지 않고 목록의 옵션에 자동으로 추가 할 수 있다면 매우 유용합니다.

이것이 가능한지 모르겠지만 누군가가 그것을 할 수있는 방법을 제안 할 수 있다면 정말 감사하겠습니다.



답변

Tom Horwood의 답변은 훌륭하지만 코드에서 중요한 오류를 수정 한 후에 만 ​​작동합니다. LIST_DATA요소에 대한 모든 참조 는 색인 j(not i)을 사용하여 이루어져야합니다 . Tom의 게시물에 대해 언급 할 업장이 충분하지 않으므로 여기에 완전한 monty가 있습니다.

아래는 올바른 코드입니다. 또한 LIST_DATA요소 의 이름을 좀 더 설명하기 쉽게 변경했습니다. 또한 Tom이 어떻게 미리 생각했는지 (kudos!) 보여주고 둘 이상의 스프레드 시트 목록의 내용으로 둘 이상의 양식 요소를 업데이트하는 기능을 제공했습니다.

var FORMID = "PUT_YOUR_FORM_ID_HERE";
var LIST_DATA = [{formFieldTitle:"Job Number", worksheetName:"JobNumbers"},
             {formFieldTitle:"Task 1 Category", worksheetName:"TaskCategories"},
             {formFieldTitle:"Task 2 Category", worksheetName:"TaskCategories"},
             {formFieldTitle:"Task 3 Category", worksheetName:"TaskCategories"},
             {formFieldTitle:"Task 4 Category", worksheetName:"TaskCategories"},
             {formFieldTitle:"Task 5 Category", worksheetName:"TaskCategories"},
             {formFieldTitle:"Task 6 Category", worksheetName:"TaskCategories"},
            ];

function onOpen(e){
  var menuEntries = [];
  menuEntries.push({name: "Update Lists", functionName: "updateLists"});
  SpreadsheetApp.getActiveSpreadsheet().addMenu("List Updater", menuEntries)
};

function updateLists() {
  var form = FormApp.openById(FORMID);
  var items = form.getItems();
  for (var i = 0; i < items.length; i += 1){
    for (var j = 0; j < LIST_DATA.length; j += 1) {
      var item = items[i]
      if (item.getTitle() === LIST_DATA[j].formFieldTitle){
        updateListChoices(item.asListItem(), LIST_DATA[j].worksheetName);
        break;
      }
    }
  }
}

function updateListChoices(item, sheetName){
  var data = (SpreadsheetApp.getActiveSpreadsheet()
              .getSheetByName(sheetName)
              .getDataRange()
              .getValues());
  var choices = [];
  for (var i = 0; i < data.length; i+=1){
    choices.push(item.createChoice(data[i][0]));
  }
  item.setChoices(choices);
}

이 기능을 작동시키는 방법을 요약하려면 (처음으로 Google Apps Script를 사용하는 사람). 위의 코드 스 니펫에서 시트 이름과 양식 필드 이름을 참조하여 더 이해하기 쉽도록했습니다.

  1. 양식과 관련된 스프레드 시트에서 :

    • 새 워크 시트를 만듭니다. 필드에 추가하려는 항목 목록이 포함됩니다. 워크 시트에 적절한 이름을 지정하십시오 (예 🙂 TaskCategories. 항목 목록을 해당 워크 시트의 첫 번째 열에 넣으십시오. 해당 시트의 추가 열과 행을 모두 삭제하십시오 (필수 또는 불필요-테스트하지 않은 경우)
    • 도구 메뉴에서 “스크립트 편집기”를 선택하십시오. 위의 코드 스 니펫을 복사하여 스크립트 편집기에 붙여 넣습니다. 스크립트의 다음 부분을 변경해야합니다.
      • 변수의 값은 FORMID양식의 ID로 변경해야합니다. ID는 브라우저의 URL 표시 줄에 원하는 형식의 긴 코드 (슬래시 사이)입니다.
      • LIST_DATA변수는 양식과 사용자의 요구에 맞게 수정해야합니다. 의 각 항목 LIST_DATAformFieldTitle및 의 튜플입니다 worksheetName. 전자는 양식 필드의 이름 ( “목록에서 선택”유형의 필드 여야 함)입니다. 양식 편집기에서는이 이름을이라고 Question Title합니다. 후자는 필드를 채울 항목 목록이 포함 된 앞에서 만든 워크 시트의 이름입니다. 필요한만큼이 튜플을 목록에 추가하십시오.
      • 이제 스크립트를 저장하십시오 (저장 아이콘을 클릭하십시오)
      • 스크립트 편집기 메뉴에서 ‘실행’을 선택하고 “updateLists”를 선택하여 스크립트를 테스트하십시오. 이 작업을 처음 수행하면 허가를 요청합니다. 스크립트가 성공하면 양식에 지정된 필드가 채워져 있음을 알 수 있습니다. 그렇지 않으면 화면에 오류 메시지가 표시됩니다.
  2. 스프레드 시트로 돌아 가면이라는 제목의 새 메뉴 항목이 표시 List Updater됩니다. Update Lists목록 워크 시트를 변경할 때마다 실행 해야하는 항목이 하나 있습니다. 그에 따라 양식이 업데이트됩니다.

독자의 이익을 위해 FormRanger는 새로운 Google 스프레드 시트와 함께 작동하지 않습니다. FormRanger 개발자는 자신의 웹 사이트에서 많은 것을 말합니다. 아마도 / 희망적으로 그것은 미래에 바뀔 것이지만,이 게시 시점에서 위의 코드는 저에게 효과적이며 클라이언트를 위해 배포 된 형태로 사용하고 있습니다.


답변

일반적인 양식과 스크립트로 Form.getItems ()를 사용하여 루프에서 항목을 찾은 다음 Item.asListItem (). setChoices (…)를 사용하여이 작업을 수행 할 수 있습니다.

다음은이 예제 시트양식 에서 사용한 샘플 코드입니다.

var FORMID = "YOUR FORM ID HERE";
var LIST_DATA = [{title:"Who's your tutor", sheet:"TutorName"}]

function onOpen(e){
  var menuEntries = [];
  menuEntries.push({name: "Update Lists", functionName: "updateLists"});
  SpreadsheetApp.getActiveSpreadsheet().addMenu("List Updater", menuEntries)
}

function updateLists() {
  var form = FormApp.openById(FORMID);
  var items = form.getItems();
  for (var i = 0; i < items.length; i += 1){
    for (var j = 0; j < LIST_DATA.length; j+=1) {
      var item = items[i]
      if (item.getTitle() === LIST_DATA[j].title){
        updateListChoices(item.asListItem(), LIST_DATA[j].sheet);
        break;
      }
    }
  }
}

function updateListChoices(item, sheetName){
  var data = (SpreadsheetApp.getActiveSpreadsheet()
              .getSheetByName(sheetName)
              .getDataRange()
              .getValues());
  var choices = [];
  // If your sheets have headers, change i = 0 to i = 1
  for (var i = 0; i < data.length; i+=1){
    choices.push(item.createChoice(data[i][0]));
  }
  item.setChoices(choices);
}

답변

적어도 반자동 방식을 제공하는 Form Values 라는 Google Forms 애드온 이 있습니다. 스프레드 시트에서 답변을 변경할 때마다 답변의 선택 항목을 수동으로 다시 채워야하지만 적어도 간단합니다. .


답변

일반 Google 설문지로는이 작업을 수행 할 수 없습니다.

그러나 Google Apps 스크립트 , 특히 UIService 를 사용하여 고유 한 GUI를 만들 수 있습니다 . 그러나 전체 GUI를 다시 작성해야한다는 점에 유의하십시오. 기존 양식의 일부는 사용할 수 없습니다.

또는 GUI Builder를 사용할 수 있습니다 . Google Apps Script GUI 용 WYSIWYG 편집기입니다.

어느 것을 선택하든 원하는 것을 달성하기 위해 프로그래밍을 할 준비가되어 있어야합니다.


답변


답변

에 대해 Trigger [ 1 ] [ 2 ]를 설정하여 목록 업데이트를 자동화하는 방법이 있습니다 Update Lists.

경로는 스크립트 편집기-> 리소스-> 현재 프로젝트의 트리거입니다.

그런 다음, add a new trigger. 주어진 예제의 경우 및 updatesList을 실행하도록 설정할 수 있습니다 . 이런 식으로 기능 이 필요하지 않습니다.from spreadsheetOn form submissiononOpen


답변

예, 하루 종일 답변을 찾아 내 목적을 위해 개발하는 데 많은 시간을 할애했지만 할 수는 있습니다.

사람들이 자원 봉사하려는 지역 목록에서 여러 개의 상자를 체크 할 수있는 자원 봉사 가입 양식이 필요했습니다. 따라서 여러 상자가있는 한 가지 질문은 문제의 Google 스프레드 시트가 하나의 셀에서 확인한 모든 것을 나열한다는 것입니다. 21 개의 자원 봉사 옵션이 있었으므로 해당 정보에 유용한 형식이 아닐 것입니다. 나는 당신이 원한다고 말한 것을 이해하고 싶었습니다. 나는 21 개의 옵션 각각이있는 열을 그 자체의 열에 넣고 싶습니다. 그런 다음 타임 스탬프 (생성 된 양식), 이름, 이메일 및 전화 옆에 “예”또는 비워 둔 21 개의 열이 있습니다. 열 제목은 선택할 수있는 각 옵션입니다. “예”또는 “아니오”로 21 개의 질문이없는 이유가 궁금 할 수도 있습니다.

먼저 누군가 Google 양식을 작성하면 결과 스프레드 시트는 다음 빈 행에 데이터를 추가하지 않고 행을 삽입합니다. 이것은 행에 있던 모든 수식이 막 다운되었고 수식의 새 데이터에 입력 데이터를 처리 할 수있는 수식이 없습니다. 이를 넘어 서기 위해 스프레드 시트 (워크 북)에 시트를 추가했습니다. http://productforums.google.com/forum/#!topic/docs/dlW6U6cHuKw 에서 brettathds의 입력을 사용 하여이 두 번째 시트의 셀 A1에 다음 수식을 삽입했습니다. = ARRAYFORMULA (Sheet1! A1 : A). 열 E를 통해 각 열에 대해 비슷한 작업을 수행했습니다. 열 E에는 21 개의 확인란이 있습니다.

여전히 두 번째 시트에서 FY 열의 1 행에는 자원 봉사하고자하는 영역의 체크리스트에서 각 확인란 옵션의 텍스트와 동일한 헤더가 있습니다. 그런 다음 Z 열은 양식의 다음 및 마지막 질문이었으며 제목은 “추가 설명”이라는 짧은 텍스트 질문이었습니다. 해당 열에 대해 = ARRAYFORMULA (Sheet1! F1 : F)를 사용했습니다. 확인란 질문 끝에 “other”옵션을 사용하는 대신 별도의 질문으로이 작업을 수행했습니다. 스프레드 시트로 데이터를 출력합니다.

이제 열 E의 셀 (정보가 최대 21 개까지 나열 될 수 있음)에서 정보를 가져 와서 “yes”또는 공백으로 열을 구분하는 방법에 대해 설명합니다. 두 번째 시트의 F2의 수식은 = iferror (if (search (F $ 1, $ E2)> 0, “Yes”,))입니다.이 수식은 열 머리글 (F1)의 정확한 텍스트가 있는지 확인합니다. E2에서 “그렇다면” “예”를 반환하고 그렇지 않으면 비워 둡니다.

F2에서 참조 된이 수식은 FY 키를 통해 “$”를 사용하여 작성되므로 F2를 GY에서 행 2의 각 셀로 복사 / 붙여 넣기 할 수 있습니다 (Google 스프레드 시트는 드래그 / 복사를 통한 수식 복사를 지원하지 않습니다) Excel에서는 F2, CTRL + C, G2 : Y2, CTRL + V를 차례로 선택하면됩니다. 그런 다음 동일한 방법론을 사용하여 F2 : Y2를 F3 : Y100에 붙여 넣었습니다.

그런 다음 두 번째 시트에 열 E를 숨겨서 결과 스프레드 시트가 더 컴팩트 해졌습니다 (긴 대답에서 모든 줄 바꿈을 피함).

이제 99 명의 자원 봉사자를 빠르고 쉬운 양식을 통해받을 준비가되었습니다. 열 맨 위에있는 필터 옵션을 사용하면 누가 어떤 영역에서 사용 가능한지 확인할 수있었습니다.

내가 해결하지 못한 마지막 좌절. 수식과 디자인을 테스트하기 위해 가짜 양식을 완성한 다음 연결된 스프레드 시트에서 해당 행을 삭제했습니다. 또한 중복 양식을 작성한 몇 명의 사람들이 있었고 행도 삭제했습니다. 제품 포럼에서 주목할만한 점은 Google이 여전히 “응답 요약”(스프레드 시트의 “양식”탭에 있음)에 연결된 테스트 / 보그 / 중복 데이터를 가지고 있다는 사실을 알고 좌절 한 것은 아닙니다. 따라서 테스트 / 보거스 / 중복 폼에서 데이터를 제거하기 위해 행을 삭제 한 경우 응답 요약은 정확도에 쓸모가 없습니다.

그러나 그것은 성취되고 다음에 비슷한 것이 필요할 때이 노트를 저장하고 있습니다. 다음 번에 30 분 이내에 쉽게 수행 할 수 있다고 확신합니다.

이것이 도움이되기를 바랍니다. 질문이 있으면 알려주십시오.