如何在不显示 "destination" tab/sheet 的情况下使用 copyTo(),让用户保持原样(使用 Google Apps 脚本)?

How to use copyTo() without showing "destination" tab/sheet, keeping the user where he is (using Google Apps Script)?

有!

下面的函数基本上是将行复制到另一个 sheet。这是经过调整的代码示例。 我发现的问题是: 当这将行复制到新的 sheet 时,sheet 变为活动状态。我稍后会删除它,但用户会被拖到这个临时 sheet 中,我想知道是否有办法使用 copyTo() 来做到这一点,但不会在前面移动标签用户。

/*
*It moves the order row into Production Sheet in WIP, as the user sets status Confirmed;
*/
function installedOnEdit(e) {
  const dstSpreadsheetId = "XXXXXxxxxxxxxXXXXXXXXXX" // Please set the destination Spreadsheet ID.
  const destSheetName = 'Página23'

  //Maps the values to serve as criteria to decide if this should continue running
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const orderSheet = ss.getSheetByName('Orders');
  const activeSheetName = ss.getActiveSheet().getName();
  const thisRow = e.range.getRow();
  const thisCol = e.range.getColumn();
  const cellValue = e.range.getValue();
  if (activeSheetName == orderSheet.getName() && thisRow > 5 && thisCol < 13 && cellValue == 'Confirmed') {
      moveOrder(ss, orderSheet, thisRow, dstSpreadsheetId, destSheetName)
      orderSheet.getRange(thisRow, thisCol).setValue('')
    }
  }
}

function moveOrder(ss, orderSheet, thisRow, dstSpreadsheetId, destSheetName) {
  const orderHeaders = orderSheet.getRange(5, 1, 1, 13);//Gets the table headers.    
  const rowValues = orderSheet.getRange(thisRow, 1, 1, 13);//Gets the changed row

  const newSheet = ss.insertSheet('MoveOrderToWIP');//Creates a temporary sheet
  orderHeaders.copyTo(newSheet.getRange(newSheet.getLastRow() + 1, 1), { contentsOnly: true });//Moves the headers into the temporary sheet
  rowValues.copyTo(newSheet.getRange(newSheet.getLastRow() + 1, 1), { contentsOnly: true });//Moves the row into the temporary sheet

}

谢谢!

你所需要的只是从射程到射程没有必要实际激活sheets

中的任何一个

fromRange.copyTo(toRange);

可能是 insertSheet() 使其处于活动状态 sheet。因此,在执行插入

后,让其他 sheet 成为活动 sheet

当我看到您更新后的脚本时,dstSpreadsheetIddestSheetName 似乎没有在 moveOrder 函数中使用。虽然我不明白你是否只想使用一个相同的 Spreadsheet,例如,当你想将编辑范围保持为活动范围时,即使 [=15= 插入了新的 sheet ],下面的修改怎么样?

问题与解决方案:

  • 在您的脚本中,ssconst ss = SpreadsheetApp.getActiveSpreadsheet();。在这种情况下,当使用 insertSheet 时,激活的范围会发生变化。在这种情况下,即使将 ss 用作 e.source,也会出现相同的结果。好像这是目前的规范。

  • 当您想要在使用 insertSheet 时保持活动范围,请使用 SpreadsheetApp.openById() 而不是 SpreadsheetApp.getActiveSpreadsheet()。这样,即使使用 insertSheet,活动范围也不会改变。

当这反映在您的脚本中时,它将变成如下。在这个修改中,你的显示脚本被修改了。请注意这一点。

修改后的脚本:

发件人:

const newSheet = ss.insertSheet('MoveOrderToWIP');

收件人:

const newSheet = SpreadsheetApp.openById(ss.getId()).insertSheet('MoveOrderToWIP');
  • 通过从外部调用Spreadsheet,即使使用insertSheet,也可以保持活动范围。在这种情况下,即使使用 Sheets API,也会出现相同的结果。

注:

  • 在您的脚本中,插入“MoveOrderToWIP”sheet 后,脚本再次运行,出现错误。因为 Spredsheet 中存在相同的 sheet 名称。所以,请注意这一点。

参考: