将光标设置到 insertRowBefore 之后的 Google 个工作表之后的正确位置

Set cursor to correct location after Google Sheets after insertRowBefore

我有以下 Google 表格功能:

function addRow() {
   var destinationSheet = SpreadsheetApp.getActiveSheet();
   var currentRow = destinationSheet.getActiveCell().getRow();

  // Insert the row
  destinationSheet.insertRowBefore(currentRow);

  // Copy the source to destination (currentRow is the blank line)
  var sourceRange = destinationSheet.getRange(currentRow + 1, 1, 1, destinationSheet.getLastColumn());
  var targetRange = destinationSheet.getRange(currentRow - 0, 1, 2, destinationSheet.getLastColumn());
  
  // Fill upwards
  sourceRange.autoFill(targetRange, SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);
  SpreadsheetApp.getUi().alert(destinationSheet.getActiveCell().getRow());
};

它在当前行上方创建一个空白行,并将当前行复制到空白行中。这行得通。

光标(视觉上)结束在新行中。换句话说,视觉上,当我执行 insertRowBefore 时,光标停留在原处,下面的行向下移动。

但是,当我在没有事先移动光标的情况下键入单元格(第一列)时,它键入了光标所在的单元格,但是当我按下 Return 时,数据“跳转”到下面的单元格就像我一直在那里打字一样。就好像光标实际上在下面的行中并且 UI 不同步。然而,警报“告诉”我我在正确的行(空然后填充的行)。

有趣的是,如果我在 UI 中不移动光标而重新 运行 函数,我注意到活动行增加了 1。因此,我认为 UI 在函数完成后移动了光标,但未能以图形方式显示它。

我的问题是:我该怎么做:

  1. 获取 UI 以正确显示活动光标位置?或者,理想情况下
  2. 防止光标的这种“幕后”移动,使其保持在正确的单元格中(添加的行的第 1 列)。

Google Apps Script Spreadsheet Service 没有控制光标位置的方法,但可以设置活动单元格。 以下是众多方法中的一种:

function setCurrentCell(){
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = spreadsheet.getSheetByName('Sheet1');
  const range = sheet.getRange('B2'); // This should be a single cell
  range.activateAsCurrentCell();
}

另一种方法是在 Range 对象上使用 activate()。当前单元格将是范围内左上角的单元格。

参考

相关

我通过在函数末尾添加以下 3 行来修复它:

  destinationSheet.getRange(currentRow - 1, 1, 1, destinationSheet.getLastColumn()).activate();
  destinationSheet.getRange(currentRow, 1, 1, destinationSheet.getLastColumn()).activate();
  destinationSheet.getRange(currentRow, 1).activate();

这是我设法让它工作的唯一方法。它:

  1. 激活前一行
  2. 激活当前行
  3. [可选]激活当前行的第一个单元格。

然后,当我在单元格中键入内容时,当我按下回车键时,它不会下拉一行。请注意,对于前两行额外代码,有必要 select 多于第一列 - 因此整行都是 select。因此,问题在前两行代码后得到解决。第三个只是修饰 select 仅行中的第一列。

我不知道为什么这行得通以及为什么其他变体行不通。