Чи можна в Google Формах надати унікальне значення кожному рядку, який він вставляє в електронну таблицю, а також часовій позначці?
Чи можна в Google Формах надати унікальне значення кожному рядку, який він вставляє в електронну таблицю, а також часовій позначці?
Відповіді:
Це можна зробити, додавши тригер сценарію.
Припустимо, у вашій поточній формі є два стовпці Timestamp
та відповідь на одне питання. Отже, у вас зараз стовпці А та В заповнюються даними. Припускаємо, що ви хочете, щоб у стовпці С був номер автоматичного збільшення.
Спочатку потрібно перейти до 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.
Тепер, коли ваша форма буде подана, вона заповнить номер рядка у стовпці C разом із даними, які були надіслані через вашу форму.
Щоб змінити стовпець, щоб номер рядка зберігався, вам потрібно змінити цей рядок сценарію:
sheet.getRange(row,3).setValue(row);
і змінити значення 3 на відповідний номер індексу стовпця.
На додаток до відмінної відповіді Баррі, якщо ви хочете мати змогу видаляти рядки та зберігати унікальний ідентифікатор, ви можете мати статичну комірку, яка підтримує кількість. Потім ви можете використовувати це число та збільшувати його при кожному новому записі до таблиці.
Таким чином, модифікацією було б зберегти номер десь у вашій електронній таблиці ('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);
}
Знову ж таки, змініть другий останній рядок, щоб змінити місце свого ідентифікатора.
Спираючись на обидві попередні відповіді (від Баррі та Денні):
Припустимо, що стовпчик ідентифікатора - це стовпець А. Виберіть клітинку «Наступний ідентифікатор» та встановіть її у такій формулі (припустимо, що вона є у «Р1»):
=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);
}
}
Додайте тригер сценарію за допомогою меню "Тригери" в редакторі сценаріїв:
Надалі вище наведені відповіді. Це рішення не потребує додаткової комірки електронних таблиць.
Ви можете використовувати вбудовані обробники подій для подання форми, щоб отримати унікальний ідентифікатор. Оскільки електронна таблиця є лише призначенням форми, видалення рядка фактично не видаляє відповідь. Маючи це на увазі ...
EDIT: видалено потребу в ідентифікаторі та вирішено проблеми з форматуванням дати.
/**
* 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 в активному рядку, коли цей рядок буде відредаговано, але лише якщо вже не вказане значення.
Ви повинні встановити тригер, як зазначено в інших відповідях на редагування.
Для "Чи можливо у формі Google надати унікальне значення кожному рядку, який він вставляє у таблицю, а також часовій позначці?" одночасно дозволяючи видалити рядок на аркуші відповідей форми перед додаванням подальшої відповіді без дублювання значень, це має працювати:
=iferror(ArrayFormula(match(A1:A,A:A,0)),"")