Ответы Google Form сбрасываются каждый месяц - PullRequest
1 голос
/ 09 июня 2019

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

Первые ответы занимают первую строку в электронной таблице, второй ответ занимает строки в секундах и т. Д.

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

Например, если у меня было 4 ответа, последний будет в строке 4 таблицы.Если я уберу ответ и добавлю другой, он будет добавлен в 5-ю строку (в то время как предыдущая строка 4 пуста).

Можно ли сбросить «индекс» для новых ответов после того, как яочистил их?

Вот мой скрипт Google App для этого:

 var financeSheet = SpreadsheetApp.openById(_spreadsheetId);
 var financeForm = FormApp.openById(_formId);
 var expencesSheet = financeSheet.getSheetByName(_sheet);

 // Clean the form and the responses
 financeForm.deleteAllResponses();
 expencesSheet.getRange(2, 1, 100, 5).clear();

1 Ответ

1 голос
/ 09 июня 2019

Это связано с тем, что скрипт просто «очищает» все данные из строк с помощью вызова метода clear().Если вы хотите убедиться, что строка удалена из структуры Spreadsheet, используйте метод deleteRow() или deleteRows().

Ps Хотя getLastRow() может заставить вас поверить в обратное, если вы проверили числострок с ним, в документации четко указано, что она насчитывает только строк с содержанием , пропуская, таким образом, пустые строки, clear().

Уточнение

Возможно, мой ответ не был достаточно ясным о том, почему вы должны обратиться к SpreadsheetApp вместо FormApp.Проблема здесь в том, что вы сохраняете количество строк в листе при вызове метода clear(), а формы всегда отправляют ответ в следующую строку после последней независимо от того, содержит ли он данные или нет (вот почему "он продолжает, как если бы предыдущая строка таблицы была заполнена" - строк-заполнителей осталось без данных).

Тест

Вы можете увидеть разницу сами, запустив эту функцию (метод getMaxRows() возвращает каждую строку независимо от ее содержимого):

function getNumRows() {

  var ss = SpreadsheetApp.getActive();
  var sh = ss.getActiveSheet();

  var initial = sh.getMaxRows();
  Logger.log('Initial number of rows: '+initial);

  sh.appendRow(['test']);

  var plusOne = sh.getRange(sh.getMaxRows(), 1, 1, sh.getLastColumn());
  plusOne.clear();

  var cleared = sh.getMaxRows();
  Logger.log('Number of rows after clearing: '+cleared);

  sh.deleteRow(sh.getMaxRows());

  var deleted = sh.getMaxRows();
  Logger.log('Number of rows after deletion: '+deleted);

}

WYSIWYG

Если вы все еще не верите мне, вот пример, который я создал и протестировал ваш случай - как вы можете видеть, результат отличается в зависимости от использования deleteRow()метод или clear() и не имеет ничего общего с перезаписываемой формой или нет (я вообще не вызываю метод deleteAllResponses()).

enter image description here

Полезные ссылки

  1. deleteRow() reference ;
  2. getLastRow() ссылка ;
  3. getMaxRows() ссылка ;
  4. clear() ссылка ;
...