如何在不显示 "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
当我看到您更新后的脚本时,dstSpreadsheetId
和 destSheetName
似乎没有在 moveOrder
函数中使用。虽然我不明白你是否只想使用一个相同的 Spreadsheet,例如,当你想将编辑范围保持为活动范围时,即使 [=15= 插入了新的 sheet ],下面的修改怎么样?
问题与解决方案:
在您的脚本中,ss
是 const 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 名称。所以,请注意这一点。
参考:
有!
下面的函数基本上是将行复制到另一个 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当我看到您更新后的脚本时,dstSpreadsheetId
和 destSheetName
似乎没有在 moveOrder
函数中使用。虽然我不明白你是否只想使用一个相同的 Spreadsheet,例如,当你想将编辑范围保持为活动范围时,即使 [=15= 插入了新的 sheet ],下面的修改怎么样?
问题与解决方案:
在您的脚本中,
ss
是const 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 名称。所以,请注意这一点。