Google 양식을 기반으로 Google 스프레드 시트에 자동 증가 필드를 추가 할 수 있습니까?


20

Google 설문지에서 스프레드 시트 및 타임 스탬프에 삽입하는 각 행에 고유 한 값을 부여 할 수 있습니까?


AFAIK 타임 스탬프는 양식을 만들 때 자동으로 추가됩니다. 스프레드 시트의 열을 내부에보고 싶은데 때, 첫 번째 타임 스탬프 (당신이 어떤 이유로 그것을 삭제하고 난 정말 당신이 할 경우 발생하는 알 수없는 경우가 아니라면) 보통
로버트 Koritnik을

트리거를 만들고 스크립트에 코드를 추가 한 후 양식을 제출할 때 아무 일도 일어나지 않기 때문에이 답변이 제공된 이후에 무언가가 변경되었다고 생각합니다. 누구든지 위의 솔루션이 Google 스프레드 시트의 새 버전에서 작동하도록하는 데 대한 조언이 있습니까
user3255228

답변:


11

스크립트 트리거를 추가하여이 작업을 수행 할 수 있습니다.

현재 양식에 두 개의 열과 Timestamp하나의 질문에 대한 답변 이 있다고 가정합니다 . 따라서 현재 데이터로 채워지는 열 A와 B가 있습니다. C 열에 자동 증분 번호가 필요하다고 가정합니다.

먼저 이동해야합니다 Tools > Script Editor

스크립트 편집기 창에서 다음 스크립트를 입력하십시오.

function onFormSubmit(e) {

var sheet = SpreadsheetApp.getActiveSheet();
var row =  SpreadsheetApp.getActiveSheet().getLastRow();

sheet.getRange(row,3).setValue(row);


}

스크립트를 저장 한 다음 Triggers메뉴 로 이동하여Current script's triggers

다음과 같이 드롭 다운을 채우십시오.

Google 스크립트 트리거

딸깍 하는 소리 Save

그런 다음 Google App Script 창을 저장하고 닫습니다.

이제 양식을 제출하면 C 열의 행 번호와 양식을 통해 제출 된 데이터가 채워집니다.

행 번호가 저장되는 열을 변경하려면 다음 스크립트 행을 변경해야합니다.

sheet.getRange(row,3).setValue(row);

값 3을 해당 열 인덱스 번호로 변경하십시오.


이 스크립트를 사용할 수는 있지만 행을 삭제하거나 추가하면 예를 들어 망치지 않도록 고유 번호가 필요합니다 .ID 또는 행 1, 2, 3, 4, 5, 6이 있지만 수동 삭제 양식 제출 후 5는 ID 6으로 5 행으로 이동하므로 양식 제출의 다음 ID는 다시 6이됩니다. 타임 스탬프를 사용하여 고유 한 자동 증분 번호를 만들 수 있습니까?

더 좋은 점은 이제 모든 데이터로 제어하는 ​​URL을 가져 와서 내 앱에 바로 넣는 데 사용합니다.
Toby Allen

7

Barry의 탁월한 답변 외에도 행을 제거하고 여전히 고유 ID를 유지하려면 카운트를 유지하는 정적 셀을 가질 수 있습니다. 그런 다음이 숫자를 사용하여 테이블에 새로 입력 할 때마다이를 증가시킬 수 있습니다.

따라서 수정은 스프레드 시트 어딘가에 숫자를 유지하고 (아래 코드에서 'M1') 다음과 같이 코드를 수정합니다.

function onFormSubmit(e) 
{
   var sheet = SpreadsheetApp.getActiveSheet();
   var row =  SpreadsheetApp.getActiveSheet().getLastRow();

   var bugCount = sheet.getRange("M1").getValue();
   bugCount++;

   sheet.getRange(row,1).setValue(bugCount);
   sheet.getRange("M1").setValue(bugCount);
}

다시 두 번째 마지막 줄을 변경하여 ID가있는 위치를 변경하십시오.


나는 이것을 적용했지만 데이터 행 사이에서 행을 삭제하는 경우에는 성공하지 못합니다. 그것은 숨겨진 삭제 행이 발생할 때마다 값을 업데이트해야하므로

고유 ID가 필요한 모든 경우 (원래 질문에 따라) 삭제시 번호를 업데이트 할 필요가 없습니다. 삭제시 값을 줄이면 중복 ID가 표시됩니다.
Danny Parker

7

이전 답변 (Barry and Danny)을 기반으로 :

ID 열이 열 A라고 가정합니다. "다음 ID"셀을 선택하고 다음 공식으로 설정하십시오 ( "P1"에 있다고 가정).

=MAX(A:A)+1

"도구"메뉴에서 스크립트 편집기를 사용하여 스크립트를 작성하고 다음을 붙여 넣으십시오.

function onFormSubmit(e) {
  // Get the active sheet
  var sheet = SpreadsheetApp.getActiveSheet();
  // Get the active row
  var row = sheet.getActiveCell().getRowIndex();
  // Get the next ID value.  NOTE: This cell should be set to: =MAX(A:A)+1
  var id = sheet.getRange("P1").getValue();
  // Check of ID column is empty
  if (sheet.getRange(row, 1).getValue() == "") {
    // Set new ID value
    sheet.getRange(row, 1).setValue(id);
  }
}

스크립트 편집기에서 "Triggers"메뉴를 사용하여 스크립트 트리거를 추가하십시오. 여기에 이미지 설명을 입력하십시오


4

위의 답변 외에도-이 솔루션에는 추가 스프레드 시트 셀이 필요하지 않습니다.

내장 된 이벤트 핸들러를 사용하여 양식을 제출하여 고유 한 ID를 얻을 수 있습니다. 스프레드 시트는 양식의 대상 일 뿐이므로 행을 삭제해도 실제로 응답이 삭제되지는 않습니다. 그걸 염두에두고 ...

편집 : ID가 필요없고 날짜 형식 문제를 처리했습니다.

/**
* This function extracts the relevant properties from the event handler,
* then uses them to get the uniqueID and record the response
* @param {Object} e The event parameter for form submission to a spreadsheet;
*     e has the following properties values, range, namedValues
*/

function onFormSubmit(e) {
  var uniqueID = getUniqueID(e.values);
  recordResponseID(e.range, uniqueID);
}

/**
* Records the unique ID for this response to the correct cell.
* @param  {Object} eventRange Range in which the response is written
* @param  {Integer} uniqueID   Unique id for this range
*/

function recordResponseID(eventRange, uniqueID) {
  var row = eventRange.getRow();
  var column = eventRange.getLastColumn() + 1;
  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.getRange(row, column).setValue(uniqueID);

}
/**
* A shortcut function to get the form that is connected to this spreadsheet
* @return {Form}          The form associated with this spreadsheet.
**/

function getConnectedForm() {
  var formUrl = SpreadsheetApp.getActiveSpreadsheet().getFormUrl();
  var form =  FormApp.openByUrl(formUrl);
  return form;
}

/**
* Returns a unique ID for the response, by finding the actual Response that
* has the same properties.
* @param  {Array} eventValues Array of: Timestamp_string, form_response_value...
* @return {Integer}             The unique id (by 1 based array position) of the Response
*/

function getUniqueID(eventValues) {
  var isMatch = false;
  var eventItems = eventValues.slice(1);

  var responses = getConnectedForm().getResponses();
  //loop backwards through responses (latest is most likely)
  for (var i = responses.length - 1; i > -1; i--) {
    var responseItems = responses[i].getItemResponses();
    //check each value matches

    for (var j = 0; j < responseItems.length; j++) {
      if (responseItems[j].getResponse() !== eventItems[j]) {
        break;
      }
      isMatch = true;
    }
    if (isMatch) {
      return i + 1;
    }
  }
}

function testOnSubmit() {
  var answers = [
    ["Sue", "39", "Okay I suppose"],
    ["John", "22", "Great"],
    ["Jane", "45", "yeah no"],
    ["Bob", "33", "Super"]
  ];

  var form = getConnectedForm();
  var items = form.getItems();
  for (var i = 0; i < answers.length; i++) {
    var formResponse = form.createResponse();
    for (var j = 0; j < items.length; j++) {
      var item = items[j];
      var itemResponse = item.asTextItem().createResponse(answers[i][j]);
      formResponse.withItemResponse(itemResponse);
    }
    formResponse.submit();
    Utilities.sleep(500);
  }

}

나는 이것을 얻지 못한다. 양식을 제출할 때 어떻게 호출됩니까?
CodyBugstein

@Imray : 이것이 스프레드 시트의 스크립트 여야한다고 생각합니다. 스프레드 시트에서 트리거를 설정하여 양식을 제출할 때 함수를 실행할 수 있습니다. 이 답변이 작동하면이 사실을 추가 할 것입니다 (확인해야합니다).
게리 S.

1
getUniqueID기능은 매우 간단 (이 기능의 논리가 아니라 뒤얽힌 방식으로하고있는 상기 한 것입니다) 날짜에 대한 응답의 길이를 반환하여 단순화 할 수있다. 기본적 기능의 단일 라인 :return getConnectedForm().getResponses().length;
아비드 H. Mujtaba

2

이것은 다른 답변의 파생물이지만 향후 사용자에게 유용 할 수 있습니다.

function onEdit(e) 
{
   var sheet = SpreadsheetApp.getActiveSheet();
   var row =  SpreadsheetApp.getActiveSheet().getActiveCell().getRow();

   var bugCount = sheet.getRange("M2").getValue();
   bugCount++;

   if (sheet.getRange(row, 1).getValue() == "") {
      sheet.getRange(row,1).setValue(bugCount);
      sheet.getRange("M2").setValue(bugCount);    
   }

}

가장 큰 차이점은 행이 편집 될 때 활성 행에서 열 1을 업데이트하지만 값이 지정되지 않은 경우에만 업데이트됩니다.

편집시 다른 답변에서 언급 한대로 트리거를 설정해야합니다.

편집시 트리거를 설정


0

를 들어 "구글 양식에서 스프레드 시트에 삽입 각 행뿐만 아니라 타임 스탬프에 고유 한 값을 제공하는 것이 가능합니까?" 값을 복제하지 않고 추가 응답을 추가하기 전에 양식 응답 시트에서 행을 삭제할 수 있지만 다음과 같이 작동합니다.

=iferror(ArrayFormula(match(A1:A,A:A,0)),"")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.