Google 설문지에서 스프레드 시트 및 타임 스탬프에 삽입하는 각 행에 고유 한 값을 부여 할 수 있습니까?
Google 설문지에서 스프레드 시트 및 타임 스탬프에 삽입하는 각 행에 고유 한 값을 부여 할 수 있습니까?
답변:
스크립트 트리거를 추가하여이 작업을 수행 할 수 있습니다.
현재 양식에 두 개의 열과 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
다음과 같이 드롭 다운을 채우십시오.
딸깍 하는 소리 Save
그런 다음 Google App Script 창을 저장하고 닫습니다.
이제 양식을 제출하면 C 열의 행 번호와 양식을 통해 제출 된 데이터가 채워집니다.
행 번호가 저장되는 열을 변경하려면 다음 스크립트 행을 변경해야합니다.
sheet.getRange(row,3).setValue(row);
값 3을 해당 열 인덱스 번호로 변경하십시오.
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가있는 위치를 변경하십시오.
이전 답변 (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"메뉴를 사용하여 스크립트 트리거를 추가하십시오.
위의 답변 외에도-이 솔루션에는 추가 스프레드 시트 셀이 필요하지 않습니다.
내장 된 이벤트 핸들러를 사용하여 양식을 제출하여 고유 한 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);
}
}
getUniqueID
기능은 매우 간단 (이 기능의 논리가 아니라 뒤얽힌 방식으로하고있는 상기 한 것입니다) 날짜에 대한 응답의 길이를 반환하여 단순화 할 수있다. 기본적 기능의 단일 라인 :return getConnectedForm().getResponses().length;
이것은 다른 답변의 파생물이지만 향후 사용자에게 유용 할 수 있습니다.
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을 업데이트하지만 값이 지정되지 않은 경우에만 업데이트됩니다.
편집시 다른 답변에서 언급 한대로 트리거를 설정해야합니다.