форма google - как собрать данные на другой лист

У меня есть форма Google, которая собирает данные в электронную таблицу (форма ответа 1). Поскольку я думаю, что существует ограничение в 4 миллиона строк, как я могу программно создать новый лист и сохранить ответ во вновь созданном листе.

Примечание: это не копирование ответа на новый лист.


person twb    schedule 01.10.2014    source источник


Ответы (1)


При использовании «New Sheets» ограничение на размер составляет примерно 2 миллиона ячеек в электронной таблице (а не 4 миллиона строк). Справочник.

Пример создания новой электронной таблицы и установки ее в качестве места назначения формы приведен в Справочник по скриптам приложений Forms:

// Open a form by ID and create a new spreadsheet.
 var form = FormApp.openById('1234567890abcdefghijklmnopqrstuvwxyz');
 var ss = SpreadsheetApp.create('Spreadsheet Name');

 // Update the form's response destination.
 form.setDestination(FormApp.DestinationType.SPREADSHEET, ss.getId());

Эта более сложная эволюция этого сценария может автоматически создавать новый файл, когда достигается некоторая заранее установленная цель (например, каждые 100 ответов), и генерировать новые имена файлов в соответствии с соглашениями об именах Google Form:

/**
 * Check number of responses and switch to new destination if needed.
 * Set up as a trigger function to run on Form submission.
 */
function checkResponseCount(e) {
  var form = e.source;
  var numResponses = form.getResponses().length;

  // Start a new destination spreadsheet after each 100 responses
  if (numResponses % 100 == 0) {
    startNewDestinationSpreadsheet();
  }
}

/**
 * Google Form script to start a new spreadsheet in the user's "root"
 * directory, for the form's responses.
 *
 * If no new name is provided, it will be automatically created based on the
 * name of the current spreadsheet destination, by incrementing the counter
 * in a standard destination name, e.g. "My Form (Responses 5)".
 *
 * @param {string}    OPTIONAL New spreadsheet name.
 *
 * @returns {string}           ID of new spreadsheet
 */
function startNewDestinationSpreadsheet(ssName) {
  var form = FormApp.getActiveForm();
  var curDest = DriveApp.getFileById(form.getDestinationId());
  var curName = curDest.getName();

  // Expect that current name is either in standard form (ENGLISH - adjust as needed)
  // or that a new name has been provided as ssName.
  if (!ssName || ssName === '') {
    if (curName.search(/\(Responses.*\)/) == -1) {
      ssName = curName+" (Responses 2)";
    }
    else if (curName.indexOf("(Responses)") !== -1) {
      ssName = curName.replace("Responses","Responses 2");
    }
    else {
      // Increment number
      ssName = curName.replace(/(\d+)+/g, function(match, number) {
         return parseInt(number)+1;
      });
    }
  }

  // Create new spreadsheet, and set as form destination
  var newSheetId = SpreadsheetApp.create(ssName).getId();
  form.setDestination(FormApp.DestinationType.SPREADSHEET, newSheetId);

  // The new destination just had ALL existing responses copied to it - wipe them
  Utilities.sleep(10000); // Wait for sheet to be updated
  var sheet = SpreadsheetApp.openById(newSheetId).getActiveSheet();
  sheet.deleteRows(2, sheet.getMaxRows()-2);  // Cannot delete all non-frozen rows, so leave one

  return newSheetId;
}

Пусть покупатель будет бдителен

Однако есть проблема. Когда вы устанавливаете электронную таблицу в качестве места назначения для формы, все существующие ответы копируются в новое место назначения. Если вас беспокоит, что у вас закончится место в целевой электронной таблице, то это, очевидно, не поможет.

По этой причине ответ, который вы не хотите - скопируйте ответы на другой лист - действительно ваш лучший вариант.

person Mogsdad    schedule 26.11.2014