您无法删除工作表 Google Sheets Script 上的所有行

Posted

技术标签:

【中文标题】您无法删除工作表 Google Sheets Script 上的所有行【英文标题】:You can't delete all the rows on the sheet Google Sheets Script 【发布时间】:2021-07-09 01:17:04 【问题描述】:

我正在尝试使用此代码从整个工作簿中删除空单元格:

//Remove All Empty Rows in the Entire Workbook
function removeEmptyRows() 
var ss = SpreadsheetApp.getActive();
var allsheets = ss.getSheets();
for (var s in allsheets)
var sheet=allsheets[s]
var maxRows = sheet.getMaxRows(); 
var lastRow = sheet.getLastRow();
if (maxRows-lastRow != 0)
  sheet.deleteRows(lastRow+1, maxRows-lastRow);
    
  

来自这篇文章:Deleting ALL empty rows in a Google Spreadsheet

问题是我不断收到此错误:“例外:您无法删除工作表上的所有行。”

工作簿有多个工作表,至少前 20 行都有数据。

对这个脚本的需求来自一个更大的问题,即由于以下错误而无法运行导入脚本:“例外:此操作会将工作簿中的单元格数量增加到超过 5000000 个单元格的限制。”

任何帮助将不胜感激!谢谢

【问题讨论】:

【参考方案1】:

如果您只需要清理所有东西,则可以通过这种方式更快更短地完成:

function removeAllRows() 
  SpreadsheetApp.getActive().getSheets().forEach(s => s.clear());

如果需要保持格式,可以使用clearContents() 代替clear()


以防万一,如果您需要删除所有 empty 行(并且不保留空行),可能不使用 deleteRows() 是有意义的,因为它很慢。您可以从工作表中获取二维数组的值,从二维数组中删除“行”,然后将其值设置回工作表上。可以这样做:

function removeEmptyRows() 

  // function to remove all empty lines from a 2D array
  const get_not_empty_rows = (data) => data.filter(row => row.filter(String) != '');

  // function to get a range on the given sheet by the size of a given 2D array
  const get_new_data_range = (s, data) => s.getRange(1, 1, data.length, data[0].length);

  var sheets = SpreadsheetApp.getActive().getSheets();

  for (let sheet of sheets)                           // for every sheet
    let all_rows = sheet.getDataRange().getValues();   // get 2D array
    let not_empty_rows = get_not_empty_rows(all_rows); // remove empty lines
    if (not_empty_rows.length > 0)                    // if there are lines
      sheet.getDataRange().clearContent();             // clean the sheet
      get_new_data_range(sheet, not_empty_rows).setValues(not_empty_rows); // set the values
    
  
  

但您需要决定是否删除工作表上的格式。 deleteRows() 其余行的格式保持不变。

【讨论】:

【参考方案2】:

您的函数似乎可以执行您想要的操作,如果工作表完全为空,我只会收到该错误。处理这种情况的一种方法是向您的 IF 添加一个条件以查看工作表中是否有任何内容:

function removeEmptyRows() 
  var ss = SpreadsheetApp.getActive();
  var allsheets = ss.getSheets();
  for (var s in allsheets) 
    var sheet = allsheets[s]
    var maxRows = sheet.getMaxRows();
    var lastRow = sheet.getLastRow();
    if (lastRow > 0 && maxRows - lastRow != 0) 
      sheet.deleteRows(lastRow + 1, maxRows - lastRow);
    
  

【讨论】:

以上是关于您无法删除工作表 Google Sheets Script 上的所有行的主要内容,如果未能解决你的问题,请参考以下文章

Google Sheets API:如何为可嵌入工作表“发布到网络”?

Discord bot 无法访问 Google Sheets 获取错误请求缺少有效的 API 密钥

如何使用 Python 中的 API 重命名 Google Sheets 电子表格中的(工作)表?

如何使用 Sheets APIv4 Java 在 Google 表格中插入一行

访问 Google Sheets 联合表时出现 BigQuery 凭据问题

G Sheets目录脚本