【问题标题】:getActiveRange returns wrong rangegetActiveRange 返回错误的范围
【发布时间】: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:
要重现问题,您需要执行以下步骤:

  1. 创建空白工作表。
  2. 将空的 1000 行添加到初始的 1000 行,因此您将有 2000 个空行。 (我认为这是问题的原因)
  3. 将上述函数添加到此电子表格中。
  4. 添加 onChange 触发器,它将调用第 3 步中的函数。
  5. 致电API request to insert values。您可以使用the page 的“试用此 API”部分来完成。 Here 是请求参数的示例。
  6. 在第 5 步之后,您应该在工作表中填写您请求中的值的行。在我的示例中,它是 A1:G1 范围内的一行。
  7. 但是 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


【解决方案1】:

以防万一,这是我试图重现问题的代码:

// install the trigger
function createSpreadsheetChangeTrigger() {
  var ss = SpreadsheetApp.getActive();
  ScriptApp.newTrigger('myOnChange').forSpreadsheet(ss).onChange().create();
}  

// main
function myOnChange(e) {
  if (e.changeType !== 'EDIT') return;
 
  var source_sheet = e.source.getActiveSheet();
  var range = source_sheet.getActiveRange();
  var lastColumn = range.getLastColumn();
  
  SpreadsheetApp.getUi().alert(lastColumn);

  // if (range.getLastColumn() !== 7) {  do stuff }

}

效果很好。

【讨论】:

  • 我终于设法重现了这个问题。将算法添加到问题中
【解决方案2】:

我能够重现您的问题,并发现它已在此处的 Google 问题跟踪器中归档:https://issuetracker.google.com/189920154

在问题编号旁边添加星号表示您也受到它的影响。

【讨论】:

  • 其实有这个问题的参考,有人贴在那里。谢谢你告诉我!
猜你喜欢
  • 2022-11-17
  • 1970-01-01
  • 1970-01-01
  • 2021-07-05
  • 1970-01-01
  • 2021-06-08
  • 1970-01-01
  • 2016-03-03
  • 2020-02-28
相关资源
最近更新 更多