【问题标题】:Challenge Looping through an array to delete rows in Google Apps Script挑战循环遍历数组以删除 Google Apps 脚本中的行
【发布时间】:2021-06-21 09:26:46
【问题描述】:

以下函数根据特定值/项目删除 Google 工作表中的行,我希望修改它以删除要删除的项目数组。

原函数

//GLOBALS
 
 
var spreadSheet = SpreadsheetApp.openById("SHEET ID"); 
 
 
var DELETE_VAL = ["Item_to_delete 1", "Item_to_delete 2", "Item_to_delete 3"]
var COL_TO_SEARCH = 5; // The column to search for the DELETE_VAL (Zero is first)
 
  
function deleteEachRow(sheetName){
  var SHEET = spreadSheet.getSheetByName(sheetName);
  var RANGE = SHEET.getDataRange();
  var rangeVals = RANGE.getValues();
  
  //Reverse the 'for' loop.
  for(var i = rangeVals.length-1; i >= 0; i--){
    if(rangeVals[i][COL_TO_SEARCH] === DELETE_VAL){
      
      SHEET.deleteRow(i+1); 
    };
  };
};

// Invoke deleteEachRow() for each sheet you want to delete the rows
["SHEET 1", "SHEET 2", "SHEET N"].forEach((sheetName) => deleteEachRow(sheetName))

我尝试传递一个遍历每个项目的 for 循环,但它会引发错误:

//GLOBALS
 
var spreadSheet = SpreadsheetApp.openById("SHEET ID"); 
 
 
var DELETE_VAL = ["Item_to_delete 1", "Item_to_delete 2", "Item_to_delete 3"]
var COL_TO_SEARCH = 7; // The column to search for the DELETE_VAL (Zero is first)
 
  
function deleteEachRow(sheetName){
  var SHEET = spreadSheet.getSheetByName(sheetName);
  var RANGE = SHEET.getDataRange();
  var rangeVals = RANGE.getValues();
  
  //Reverse the 'for' loop.
  for(var i = rangeVals.length-1; i >= 0; i--){
    for(var i = DELETE_VAL.length; i >=0; i++){
        if(rangeVals[i][COL_TO_SEARCH] === DELETE_VAL[i]){
      
           SHEET.deleteRow(i+1); 
      };
    };
  };
};

// Invoke deleteEachRow() for each sheet you want to delete the rows
["SHEET 1", "SHEET 2", "SHEET N"].forEach((sheetName) => deleteEachRow(sheetName));

TypeError: 无法读取未定义的属性“7”

意味着它不再读取 rangeVals 变量。

我也试过

.
.
.
// Invoke deleteEachRow() for each sheet you want to delete the rows
for(var i = DELETE_VAL.length; i >=0; i++){
   ["SHEET 1", "SHEET 2", "SHEET N"].forEach((sheetName) => deleteEachRow(sheetName));
};

但这只是无限期地执行,直到超时。

我知道我肯定有一些逻辑缺陷,但我快到了,请帮助。 我对 .js/.gs 的了解很少。

我又试了一次。

    function deleteEachRow(sheetName){
  var SHEET = spreadSheet.getSheetByName(sheetName);
  var RANGE = SHEET.getDataRange();
  var rangeVals = RANGE.getValues();
  
  //Reverse the 'for' loop.
  for(var i = rangeVals.length-1; i >= 0; i--){
    for(var j = DELETE_VAL.length; j >=0; j--){
        if(rangeVals[i][COL_TO_SEARCH] === DELETE_VAL[j]){
      
           SHEET.deleteRow(j+1); 
      };
    };
  };
};

【问题讨论】:

  • 感谢您为使其发挥作用所做的努力!只要您不放弃就不要担心-我们可以说出来。需要注意的一件事是,您正在运行从 DELETE_VAL.length 到 0 的循环,并递增 i 的值。我猜你想减少它,对吧?让我们从这个开始。如果有任何错误,请发布确切的错误。
  • 您在外部和内部循环中声明了相同的 var i。为内部循环索引使用不同的字母,例如 j。
  • 我已将我的函数更新为如下所示,但行为很奇怪 - 删除的行数超过了指定的行数。
  • 请看我上次的编辑,代码看起来很糟糕。

标签: javascript arrays google-apps-script google-sheets


【解决方案1】:

问题:

  • 如果您有两个嵌套的 for 循环,请确保两个计数器变量不相同 (i)。
  • j 用作DELETE_VAL 的索引。这与您要删除的工作表行不对应 (SHEET.deleteRow(j+1);)。那应该是 i 而不是 (SHEET.deleteRow(i+1);)。
  • 另外,我建议不要使用内部for 循环,而是使用includes 来检查数组DELETE_VAL 是否包含相应的单元格值。这样一来,就不需要声明 j,而这正是造成这种混乱的原因。

代码sn-p:

function deleteEachRow(sheetName){
  var SHEET = spreadSheet.getSheetByName(sheetName);
  var RANGE = SHEET.getDataRange();
  var rangeVals = RANGE.getValues();
  for(var i = rangeVals.length-1; i >= 0; i--){
    if (DELETE_VAL.includes(rangeVals[i][COL_TO_SEARCH])) {
      SHEET.deleteRow(i+1);
    };
  };
};

【讨论】:

    猜你喜欢
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    相关资源
    最近更新 更多