【发布时间】:2021-05-26 12:10:27
【问题描述】:
我有一个电子表格,由外部应用通过 Google Sheets API 进行编辑。
然后,我在该电子表格中有一个 Google Apps 脚本函数,由可安装的更改触发器调用。一开始这个函数检查changeType是否等于'EDIT',然后使用getActiveRange()检查编辑范围的最后一列。这很好用,但有时getActiveRange() 返回的范围比实际编辑的要小。
功能代码:
function myOnChange(e) {
if (e.changeType !== 'EDIT') {
Logger.log(`Wrong changeType: ${e.changeType}`);
return;
}
var source_sheet = e.source.getActiveSheet();
var range = source_sheet.getActiveRange();
if (range.getLastColumn() !== 7) {
Logger.log(`Wrong last column: ${range.getLastColumn()}`); // 9 line
Logger.log(`NumColumns: ${range.getNumColumns()}`); // 10 line
Logger.log(`SpreadsheetApp last column: ${SpreadsheetApp.getActiveRange().getLastColumn()}`); // 11 line
return;
}
// Do some stuff
}
例如,我们有空范围 A3:G5。在此范围内插入值后,它会正确填充(包括 G 列),但函数中的 getActiveRange() 返回范围 - A3:F5(getLastColumn() 和 getNumColumns() 返回 6(上面的 9-11 行代码),虽然 G 列的顺序是 7)。
为什么会这样?我在这个电子表格中有大约 30 张工作表,而这种情况只发生在其中的几张上。也许工作表上的行数会导致这种情况?
我也发现了类似的问题,但没有答案:getActiveRange returning a smaller range than expected
更新 1:
要重现问题,您需要执行以下步骤:
- 创建空白工作表。
- 将空的 1000 行添加到初始的 1000 行,因此您将有 2000 个空行。 (我认为这是问题的原因)
- 将上述函数添加到此电子表格中。
- 添加 onChange 触发器,它将调用第 3 步中的函数。
- 致电API request to insert values。您可以使用the page 的“试用此 API”部分来完成。 Here 是请求参数的示例。
- 在第 5 步之后,您应该在工作表中填写您请求中的值的行。在我的示例中,它是 A1:G1 范围内的一行。
- 但是
getActiveRange()返回 A1:F1 范围,而getLastColumn()是 6。
更新 2:
我想我找到了边缘。使用 1539 行或更少行(它们可以为空)getActiveRange() 可以正常工作。如果工作表中有 1540 行或更多行,则此函数将返回错误范围:如果 'F' 列包含在编辑范围内,getActiveRange() 将返回范围 [start column][start row]:F[end row]。所以,例如:
如果编辑的范围是A1:G1,函数将返回A1:F1;
如果编辑的范围是E2:M5,函数将返回E2:F5;
如果编辑范围为F10:L10,函数将返回F10;
如果编辑的范围是H3:N9,函数将返回右范围H3:N9;
需要提一下,这个问题只出现在API call 之后,如果手动编辑工作表,它仍然可以正常工作。
如果您能够重现此问题,请告诉我,我没疯。
【问题讨论】:
-
您知道API calls don't trigger 可安装触发器对吗?当您手动编辑工作表时会发生这种情况吗?
-
@Aerials ,不,触发器对我来说可以与 API 一起正常工作。我想是因为这个option
-
我无法重现该问题。每次进行更改时,我都会得到正确的
lastColumn。你是什么意思'这个选项'?用在什么地方? -
@Aerials ,或者可能只是 onChange 触发器是该规则的例外,根据此answer
-
@YuriKhristich ,“这个选项”与我的问题无关,这是@Aerials 对问题的回答。我不知道如何重现问题。在我看来,这几乎是随机的。就像我在问题中所说的那样,
lastColumn仅在我拥有的几张纸上返回错误值。您如何看待工作表中的行数?它可能导致问题吗?你能尝试在大约 900 行的工作表上重现它吗?
标签: google-apps-script google-sheets google-sheets-api