Google apps script Google Sheets应用程序脚本更改工作表并保持相同的活动单元格

Google apps script Google Sheets应用程序脚本更改工作表并保持相同的活动单元格,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我正在为应用程序脚本中的Google Sheets编写脚本。电子表格包含两张表,每张表上都有一个按钮。单击第一张图纸上的按钮可转到第二张图纸。单击第二个按钮将返回到第一个 这听起来很简单,但当我回到每张工作表时,我无法恢复光标的位置。它总是改为A1。这是我的密码 function changesheet2() { var spreadsheet = SpreadsheetApp.getActive(); spreadsheet.setActiveSheet(spreadsheet.get

我正在为应用程序脚本中的Google Sheets编写脚本。电子表格包含两张表,每张表上都有一个按钮。单击第一张图纸上的按钮可转到第二张图纸。单击第二个按钮将返回到第一个

这听起来很简单,但当我回到每张工作表时,我无法恢复光标的位置。它总是改为A1。这是我的密码

function changesheet2() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Sheet2'), true);
};
function changesheet1() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Sheet1'), true);
};
根据,使用参数
true
调用
setActiveSheet
应恢复先前的活动选择和光标位置。如果您在单个函数中完成所有操作,那么这似乎可以正常工作。当这里有两个单独的函数时,它不起作用


这大概是关于上下文和谁能看到什么数据。我通过让用户单击每个工作表中的按钮,从相同的用户上下文运行这两个脚本。如何使其工作?

请注意,它只有在功能相同时才能工作。因为会话仍然具有以前所在的数据。当函数停止时,您无法知道上一个选择的位置

该示例显示它仅返回到板材的上一个激活单元

// Set the first sheet as the active sheet and select the range D4:F4.
spreadsheet.setActiveSheet(firstSheet).getRange('D4:F4').activate();
// Switch to the second sheet to do some work.
spreadsheet.setActiveSheet(secondSheet);
// Switch back to first sheet, and restore its selection.
spreadsheet.setActiveSheet(firstSheet, true);
我建议您在会话结束前创建另一张工作表,存储以前的活动单元格

代码: 补充说明:
  • 创建记录表后,可以将其隐藏
  • 如果尚未记录,默认情况下将转到A1
  • getActiveCell
    将始终获取活动工作表的活动单元格。无法获取非活动工作表的活动单元格

我在这里只看到一个脚本和两个函数。你运行两个脚本是什么意思?您是否分别运行这两个函数以查看它们是否工作?sheet1上的按钮连接到function changesheet2()。sheet2上的按钮连接到函数changesheet1()。这很好地工作,谢谢。我仍然不完全理解最初的问题。“谷歌”仍然知道活动单元是什么。如果您使用原始代码更改为Sheet2,然后手动返回Sheet1,则仍会显示原始选择。您好@tenbob,如果我们回答了您的问题,请单击“接受”按钮。通过这样做,社区中其他可能与您有相同关注的人将知道他们的问题可以得到解决。如果“接受”按钮不可用,请随时告诉我。stackoverflow.com/help/accepted-answer您是否可以添加有关此问题的根本原因的任何信息。如果以编程方式返回上一张图纸,则选择将丢失。然而,如果您手动执行相同的操作,则会保留所选内容。Hi@tenbob,就目前和我的经验而言,我仍然没有找到获取其他工作表的活动单元格的方法。实际上,我尝试在另一个浏览器选项卡中重新打开一张工作表,但不管活动/选定的单元格是什么,它都会恢复为
A1
。如果我没有弄错的话,
setActiveSheet
的行为就是这样。每次API调用时,可能会有一个单独的会话,当调用
setActiveSheet
时,它会打开一个虚拟浏览器选项卡,从而将活动/选择的单元格还原回
A1
。手动更改选项卡时会有所不同,因为您仍在同一会话中。我猜是的。函数setActiveSheet()有一个参数返回到上一个选择,这似乎很奇怪。但是,即使信息显然是可用的,它也不能做到这一点。接受你的回答。谢谢
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet1 = spreadsheet.getSheetByName('Sheet1');
var sheet2 = spreadsheet.getSheetByName('Sheet2');
var record = spreadsheet.getSheetByName("record");

function changesheet() {
  var sheet = spreadsheet.getActiveSheet();
  var sheetName = sheet.getSheetName();
  var selection = sheet.getActiveCell().getA1Notation();
  if(sheetName == sheet1.getSheetName()){ // if in sheet1, go to sheet2 
    spreadsheet.setActiveSheet(sheet2);
    var sheet2LastActiveCell = record.getRange("A2").getValue();
    // if sheet2 was previously recorded, get it's last active cell
    // else, go to A1 (default cell)
    if(sheet2LastActiveCell)
      sheet2.getRange(sheet2LastActiveCell).activateAsCurrentCell();
  }
  else if(sheetName == sheet2.getSheetName()){ // if in sheet2, go to sheet1 
    spreadsheet.setActiveSheet(sheet1);
    var sheet1LastActiveCell = record.getRange("A1").getValue();
    // if sheet1 was previously recorded, get it's last active cell
    // else, go to A1 (default cell)
    if(sheet1LastActiveCell)
      sheet1.getRange(sheet1LastActiveCell).activateAsCurrentCell();
  }
  else // don't do anything if not in sheet1 or sheet2
    return;
  // record current cell of previous sheet
  recordSheet(sheetName, selection);
}

function recordSheet(sheet, range){
  if (sheet == sheet1.getSheetName())
    // record sheet1 active cell in A1
    record.getRange("A1").setValue(range)
  else 
    // record sheet2 active cell in A2
    record.getRange("A2").setValue(range)
}