过滤整个工作表时,Google 脚本appendRow() 不起作用

问题描述 投票:0回答:1

当整个工作表启用了过滤器时,我发现使用谷歌脚本的appendRow方法存在问题。

我正在尝试通过 google apps 脚本在下面的工作表中添加 3 个新行:

日期 代码 姓名 状态
2024年4月30日13:16:50 空间 测试1 好的
2024年1月5日12:02:02 空间 测试2 好的
2024年1月5日12:12:55 空间 测试3 挪威克

重现问题的步骤是:

  1. 启用工作表,并在所有列中启用过滤器,而不仅仅是在有数据的地方,如下图所示: like this image.

  2. 仅使用“DSPACE”过滤列代码。请注意,过滤所有列后,过滤器中出现“空格”选项;

现在,运行下面的代码:

function myFunction() {
    let sheet = SpreadsheetApp.openByUrl(sheetUrl);
    
    Logger.log(sheet.getLastRow()); // in this case, returns 4

    sheet.appendRow([new Date(), 'DSPACE', 'TEST 4']);
    sheet.appendRow([new Date(), 'DSPACE', 'TEST 5']);
    sheet.appendRow([new Date(), 'DSPACE', 'TEST 6']);
    
    Logger.log(sheet.getLastRow()); // with 'DSPACE' filter, returns 4, else, returns 7
}

如果范围未过滤、使用“空格”过滤或过滤器仅适用于正确的列,则行将正确附加。 available only to the correct columns

否则,数据就会消失,没有错误,并且不会附加任何行。

我错过了什么吗?

google-sheets google-apps-script filter
1个回答
0
投票

问题和解决方法:

我之前也跟你确认过同样的情况。 Ref 当将值与

appendRow()
一起放入基本过滤器反映的工作表时,似乎未附加行。这可能仍然是当前的规范。这已经在我的帖子中提到过,在那篇帖子中,我使用了一种解决方法来使用
setValues
放置值并刷新基本过滤器。使用
setValues
时,即使工作表具有基本过滤器,也可以输入值。

但是,在这里,我注意到一个新问题。在包含日期对象的值的情况下,当使用

setValues
将包含日期对象的值放入通过基本过滤器反映的工作表时,不能放入日期对象。这可能是新问题。因此,在这个答案中,我想提出以下流程。

  1. 复制当前的基本过滤器。
  2. 删除当前的基本过滤器。
  3. 将包括日期对象的值附加到工作表。
  4. 从复制的基本过滤器中设置基本过滤器。

通过此流程,包括日期对象的值可以附加到反映基本过滤器的工作表中。当你的脚本修改后,就会变成如下所示。

修改后的脚本:

请设置您的电子表格 ID 和工作表名称。

function myFunction() {
  const spreadsheetId = "###"; // Please set your Spreadsheet ID.
  const sheetName = "Sheet1"; // Please set your sheet name.

  const sheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName(sheetName);

  // Copy the current basic filter and remove it.
  const filter = sheet.getFilter();
  const obj = { filterCriteria: [] };
  if (filter) {
    obj.filterRange = filter.getRange();
    for (var i = obj.filterRange.getColumn(), maxCol = obj.filterRange.getLastColumn(); i <= maxCol; i++) {
      var filterCriterion = filter.getColumnFilterCriteria(i);
      if (filterCriterion) {
        obj.filterCriteria.push([i, filterCriterion]);
      }
    }
    filter.remove();
  }

  Logger.log(sheet.getLastRow());

  // Append values.
  const now = new Date();
  const values = [
    [now, 'DSPACE', 'TEST 4'],
    [now, 'DSPACE', 'TEST 5'],
    [now, 'DSPACE', 'TEST 6'],
  ];
  sheet.getRange(sheet.getLastRow() + 1, 1, values.length, values[0].length).setValues(values);

  // I think that in this method, the following 3 lines can be also worked. But, from the process cost, I put the values using setValues.
  // sheet.appendRow([new Date(), 'DSPACE', 'TEST 4']);
  // sheet.appendRow([new Date(), 'DSPACE', 'TEST 5']);
  // sheet.appendRow([new Date(), 'DSPACE', 'TEST 6']);

  Logger.log(sheet.getLastRow());

  // Paste the coped basic filter.
  if (obj.filterCriteria.length > 0) {
    const filter = obj.filterRange.createFilter();
    obj.filterCriteria.forEach(([i, filterCriterion]) => filter.setColumnFilterCriteria(i, filterCriterion));
  }
}

测试:

当使用您的显示表运行此脚本时,将获得以下结果。

enter image description here

注:

  • 这是一个使用您提供的表的简单示例脚本。当你的实际情况比这种情况更复杂时,这个脚本可能就无法使用了。到时候请修改一下脚本。我建议的脚本针对您问题中的显示表和基本过滤器进行了测试。请注意这一点。

参考资料:

© www.soinside.com 2019 - 2024. All rights reserved.