0

В настоящее время я использую формы Google, чтобы пользователи могли отправлять изменения сайта. Все это прекрасно работает.Сценарий Google Таблиц: автоматически удалять строку на другой лист

Я добавил дополнительную колонку с статусом билета. Теперь я написал скрипт, который проверяет, когда он обновлен до «Готово», а затем переместит эту строку в другой лист, озаглавленный «Сделано».

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

function onEdit(e){ 

    /* 
    When a user updates a status to done the ticket gets moved to another sheet 
    */ 
    var sheetNameToWatch = "Form responses 1"; // The sheet to watch for changes 
    var columnNumberToWatch = 1; // The column where the change happens on the above sheet 
    var valueToWatch = "Done"; // What is the text you are looking for 
    var sheetNameToMoveTheRowTo = "Done"; // The Sheet name for where the row gets moved to. 

    var ss = SpreadsheetApp.getActiveSpreadsheet(); // Get the active spreadsheet 
    var sheet = SpreadsheetApp.getActiveSheet(); // Get the active sheet 
    var range = sheet.getActiveCell(); // Get the current cell that has just been updated 

    // Check that you are on the correct sheet and column. 
    if (sheet.getName() == sheetNameToWatch && range.getColumn() == columnNumberToWatch && range.getValue() == valueToWatch) { 
    var targetSheet = ss.getSheetByName(sheetNameToMoveTheRowTo); // get a reference for the target sheet 
    var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1); // get a reference for the target row 
    sheet.getRange(range.getRow(), 1, 1, sheet.getLastColumn()).moveTo(targetRange); // copy the row from current sheet to the new sheet 
    sheet.deleteRow(range.getRow()); // Delete the row from the old sheet 
    } 

} 
+0

Если вы выделили 4 пробела или выделите свой код, а затем нажмите символ {} на панели редактирования, ваш код будет смещен с гораздо более удобным для чтения форматом. – zbnrg

ответ

1

Да, функция onEdit не сработает, если вы делаете это вручную, вы хотите использовать onFormSubmit триггер, который будет срабатывать, когда форма будет получен ответ. Это установленный вручную триггер, связанный с вашей формой, который должен иметь возможность выполнять функцию выше, в значительной степени, как написано.

var form = FormApp.openById('1234567890abcdefghijklmnopqrstuvwxyz'); 
ScriptApp.newTrigger('myFunction') 
    .forForm(form) 
    .onFormSubmit() 
    .create(); 

Чтобы обезопасить себя, хотя, вы можете определить свою таблицу, таблицу и диапазон по идентификатору или по имени, а не от того, являются ли они активны, я считаю getActiveWhatever() виды методов будет возвращать нулевое значение, если электронная таблица не открыта.

+0

Я попытался изменить это на triggerupmit, но это также не работает. Проблемы, похоже, связаны с строками на этом листе. Если я вручную добавлю строку и обновить столбец состояния до «Готово». Он работает отлично, кажется, что это не работает, когда я меняю строку, созданную из представления формы. –

1

Как уже упоминалось, использование активных - не самая лучшая идея.

Вместо:

var ss = SpreadsheetApp.getActiveSpreadsheet(); // Get the active spreadsheet 
var sheet = SpreadsheetApp.getActiveSheet(); // Get the active sheet 
var range = sheet.getActiveCell(); // Get the current cell that has just been updated 

Try:

var range = e.range; 
var sheet = range.getSheet(); 
var ss = sheet.getParent(); 

Если вы попробуете это, вы не можете запустить его из редактора кода, потому что ни одно событие не прошло. Вы должны выполнить его, фактически отправив форму.