当整个工作表启用了过滤器时,我发现使用谷歌脚本的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 | 挪威克 |
重现问题的步骤是:
启用工作表,并在所有列中启用过滤器,而不仅仅是在有数据的地方,如下图所示: .
仅使用“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
}
如果范围未过滤、使用“空格”过滤或过滤器仅适用于正确的列,则行将正确附加。
否则,数据就会消失,没有错误,并且不会附加任何行。
我错过了什么吗?
我之前也跟你确认过同样的情况。 Ref 当将值与
appendRow()
一起放入基本过滤器反映的工作表时,似乎未附加行。这可能仍然是当前的规范。这已经在我的帖子中提到过,在那篇帖子中,我使用了一种解决方法来使用 setValues
放置值并刷新基本过滤器。使用 setValues
时,即使工作表具有基本过滤器,也可以输入值。
但是,在这里,我注意到一个新问题。在包含日期对象的值的情况下,当使用
setValues
将包含日期对象的值放入通过基本过滤器反映的工作表时,不能放入日期对象。这可能是新问题。因此,在这个答案中,我想提出以下流程。
通过此流程,包括日期对象的值可以附加到反映基本过滤器的工作表中。当你的脚本修改后,就会变成如下所示。
请设置您的电子表格 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));
}
}
当使用您的显示表运行此脚本时,将获得以下结果。