Чи можна додати поле для автоматичного збільшення до електронної таблиці Google на основі форми Google?


20

Чи можна в Google Формах надати унікальне значення кожному рядку, який він вставляє в електронну таблицю, а також часовій позначці?


Часова позначка AFAIK автоматично додається під час створення форми. Коли ви заглянете всередину стовпців електронних таблиць, перший - це часова мітка (якщо ви її чомусь не видалили, і я насправді не знаю, що станеться, якщо ви це зробите)
Роберт Коритник

Я здогадуюсь, що з моменту даної відповіді щось змінилося, тому що після створення тригера та додавання коду до сценарію нічого не відбувається, коли форма подається. Хтось має поради щодо отримання вищезазначених рішень для роботи над новою версією Google Sheeth
user3255228

Відповіді:


11

Це можна зробити, додавши тригер сценарію.

Припустимо, у вашій поточній формі є два стовпці 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

Населяйте спади таким чином:

Тригери Google Script

Клацніть Save

Потім збережіть і закрийте вікно сценарію програми Google.

Тепер, коли ваша форма буде подана, вона заповнить номер рядка у стовпці C разом із даними, які були надіслані через вашу форму.

Щоб змінити стовпець, щоб номер рядка зберігався, вам потрібно змінити цей рядок сценарію:

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

і змінити значення 3 на відповідний номер індексу стовпця.


Чи можливо використовувати цей скрипт, але мені потрібен унікальний номер, так що якщо я коли-небудь видаляю або додаю рядок, він звичайно не викручує приклад: у мене є ідентифікатор або рядок 1, 2, 3, 4, 5, 6, але я вручну видаляю 5 після того, як ідентифікатор для надсилання форми 6 перейде до рядка 5, тож наступний ідентифікатор при надсиланні форми знову буде 6, у мене буде копія. То чи можна використовувати штамп часу і зробити з нього унікальний номер автоматичного збільшення?

Ще краще, я зараз використовую це для отримання запиту на отримання URL-адреси, яку я контролюю усіма даними, і передаю їх прямо у свій додаток
Тобі Аллен

7

На додаток до відмінної відповіді Баррі, якщо ви хочете мати змогу видаляти рядки та зберігати унікальний ідентифікатор, ви можете мати статичну комірку, яка підтримує кількість. Потім ви можете використовувати це число та збільшувати його при кожному новому записі до таблиці.

Таким чином, модифікацією було б зберегти номер десь у вашій електронній таблиці ('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);
}

Знову ж таки, змініть другий останній рядок, щоб змінити місце свого ідентифікатора.


Я застосував це, але це не вдається в разі видалення рядка між рядками даних. тож воно повинно оновлювати приховане значення кожного разу, коли відбувається видалення рядка

Номер не потребує оновлення при видаленні, якщо потрібні унікальні ідентифікатори (відповідно до оригінального запитання). Якщо зменшити значення при видаленні, ви отримаєте повторювані ідентифікатори.
Денні Паркер

7

Спираючись на обидві попередні відповіді (від Баррі та Денні):

Припустимо, що стовпчик ідентифікатора - це стовпець А. Виберіть клітинку «Наступний ідентифікатор» та встановіть її у такій формулі (припустимо, що вона є у «Р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);
  }
}

Додайте тригер сценарію за допомогою меню "Тригери" в редакторі сценаріїв: введіть тут опис зображення


4

Надалі вище наведені відповіді. Це рішення не потребує додаткової комірки електронних таблиць.

Ви можете використовувати вбудовані обробники подій для подання форми, щоб отримати унікальний ідентифікатор. Оскільки електронна таблиця є лише призначенням форми, видалення рядка фактично не видаляє відповідь. Маючи це на увазі ...

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);
  }

}

Я цього не розумію. Як це викликається під час подання форми?
CodyBugstein

@Imray: Я думаю, що це повинен бути сценарій в електронній таблиці. Ви можете встановити тригер в електронній таблиці для запуску функції під час подання форми. Я додам цей факт до цієї відповіді, якщо він працює (мені потрібно це перевірити).
Гері С.

1
getUniqueIDФункція може бути значно спрощена шляхом повернення довжини відповідей на сьогоднішній день (тобто те , що описується логік цієї функції вище роблять в досить звивистою моді). В основному один рядок у функції:return getConnectedForm().getResponses().length;
Абід Х. Муджтаба

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

Для "Чи можливо у формі Google надати унікальне значення кожному рядку, який він вставляє у таблицю, а також часовій позначці?" одночасно дозволяючи видалити рядок на аркуші відповідей форми перед додаванням подальшої відповіді без дублювання значень, це має працювати:

=iferror(ArrayFormula(match(A1:A,A:A,0)),"")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.