#javascript #google-apps-script #google-sheets
#javascript #google-apps-script #google-sheets
Вопрос:
Привет, я пытаюсь написать скрипт Google, который будет удалять строки на основе утверждения True / False. Я использую флажки и удаляю строку. Также есть ли способ, чтобы это выполнялось непрерывно, или я должен вручную запускать это каждый раз?
Кажется, я не могу запустить код для удаления строк с помощью флажка
function deleteRow() {
var ss = SpreadsheetApp.getActiveSpreadsheet()
var editSheet = ss.getSheetByName("EDIT");
var lastRowEdit = editSheet.getLastRow();
for(var i = 4; i <= lastRowEdit; i )
{
if(editSheet.getRange(i,4).getValue() == 'TRUE')
{
editSheet.deleteRow(i);
}
}
}
Комментарии:
1. Что мне делать, когда кто-то отвечает на мой вопрос?
2.
function deleteRow() { var ss = SpreadsheetApp.getActiveSpreadsheet() var editSheet = ss.getSheetByName("EDIT"); var lastRowEdit = editSheet.getLastRow(); var d=0; for(var i=4;i<=lastRowEdit;i ) { if(editSheet.getRange(i,4).getValue() == 'TRUE') { editSheet.deleteRow(i-d ); } } }
Ответ №1:
Объяснение / Проблемы:
- Если столбец вашего листа содержит
TRUE/FALSE
значения, они возвращаются как логические значения javascript в скрипте Google Apps. Поэтому сравнение, которое вам нужно сделатьgetRange(i,4).getValue() == true
, вместоgetRange(i,4).getValue() == 'TRUE'
. - Очень неэффективно вызывать
getRange
иgetValue
внутриfor
цикла. Если у вас много данных, это может быстро достичь квоты. - Правильное решение — получить данные в столбце
D
. Поэтому я вижу, что вы хотите начать с 4-й ячейкиeditSheet.getRange('D4:D' editSheet.getLastRow())
. Но это будет 2D-массив. Вас интересует конкретный столбец. Поэтому более естественно иметь одномерный массив. Вот почему вы можете уменьшить это.
Теперь, когда вы сохранили свои данные, вы хотите удалить строки. Но каждый раз, когда вы удаляете строку, структура листа меняется, и поэтому он не будет отображать ваши исходные данные. Вот почему вам нужно выполнить итерацию в обратном направлении. Я используюforEach
цикл здесь, чтобы сделать мой код более понятным, и поэтому я могу изменить свой набор данных, поэтому я повторяю каждый элемент с конца.- Поскольку
coldD
содержит логические значения javascript. Я могу напрямую использоватьif(r)
.
Решение:
function deleteRow(){
const ss = SpreadsheetApp.getActiveSpreadsheet()
const editSheet = ss.getSheetByName("EDIT");
const colD = editSheet.getRange('D4:D' editSheet.getLastRow()).getValues().flat();
colD.reverse().forEach((r,i)=>{
if(r){
editSheet.deleteRow(colD.length-i 3);
}});
}
Комментарии:
1. На этом листе будет введено больше данных, поэтому ему просто нужно просканировать столбец D на наличие всех истинных или ложных утверждений. Работает ли это постоянно или мне нужно запускать скрипт каждый раз, чтобы он вступил в силу? Также могут ли другие редакторы вносить изменения в лист, и скрипт будет запущен?
2. @CyberYourPunk 1) вам нужно запустить его вручную, выполнив эту функцию или, например, создать триггер времени для этого. 2) любой, у кого есть доступ к редактированию этого листа, может выполнить этот скрипт. 3) рассмотрите возможность принятия ответа, нажав на кнопку галочки слева от ответа.