【问题标题】:Google Sheets App Script to change sheet and keep same active cell谷歌表格应用脚本更改工作表并保持相同的活动单元格
【发布时间】:2021-02-24 13:03:14
【问题描述】:

我正在应用脚本中为 Google 表格编写脚本。该电子表格包含两个工作表,每个工作表上都有一个按钮。单击第一张纸上的按钮会将您带到第二张纸。单击第二个按钮将带您回到第一个。

听起来很简单,但是当我返回每张纸时,我无法恢复光标位置。它总是改为 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);
};

根据documentation,使用参数true 调用setActiveSheet 应该恢复之前的活动选择和光标位置。如果您在单个函数中完成所有操作,这似乎可以正常工作。当这里有两个单独的功能时,它不起作用。

这大概是关于上下文以及谁可以看到什么数据的问题。我通过让用户单击每个工作表中的按钮来从相同的用户上下文运行这两个脚本。我怎样才能让它发挥作用?

【问题讨论】:

  • 我在这里只看到一个脚本和两个函数。你是什​​么意思你运行两个脚本?您是否分别运行这两个函数以查看它们是否正常工作?
  • sheet1 上的按钮连接到函数 changesheet2()。 sheet2 上的按钮连接到函数 changesheet1()。

标签: google-apps-script google-sheets


【解决方案1】:

请注意,它只有在同一个函数中才会起作用。由于会话仍然具有以前所在的数据。当函数停止时,您无法知道之前的选择在哪里。

示例code 显示它只是返回到工作表的上一个激活单元格。

// 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);

我可以建议您在会话结束之前创建另一个工作表来存储他们以前的活动单元格。

代码:

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)
}

补充说明:

  • 您可以在创建记录表后将其隐藏。
  • 如果还没有记录,默认到A1。
  • getActiveCell 将始终获取活动工作表的活动单元格。它无法获取非活动表的活动单元格。

【讨论】:

  • 这很好用,谢谢。我仍然不完全理解原始问题。 “谷歌”仍然知道活动单元格是什么。如果您使用原始代码更改为 Sheet2 然后手动返回到 Sheet1 仍然显示原始选择。
  • 嗨@tenbob,如果我们回答了您的问题,请点击接受按钮。通过这样做,社区中可能与您有同样担忧的其他人将知道他们的问题可以得到解决。如果您无法使用接受按钮,请随时告诉我。 stackoverflow.com/help/accepted-answer
  • 你能补充一下这个的根本原因吗?如果您以编程方式返回上一张工作表,则选择丢失。而如果您手动执行相同的操作,则会保留选择。
  • 嗨@tenbob,就目前而言,根据我的经验,我还没有遇到一种方法来获取其他工作表的活动单元格。实际上,我尝试在另一个浏览器选项卡中重新打开工作表,并且无论活动/选择的单元格如何,它都会恢复为A1setActiveSheet 的行为,如果我没记错的话,就是这样。对于每个 API 调用,可能会有一个单独的会话,当调用 setActiveSheet 时,它会打开一个虚拟浏览器选项卡,从而将活动/选择的单元格恢复为 A1。当您手动更改选项卡时会有所不同,因为您仍在同一会话中。这是我的猜测。
  • 是的。函数setActiveSheet()似乎很奇怪,有一个参数可以返回之前的选择。但即使信息显然可用,它也不会这样做。接受你的回答。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-09
  • 1970-01-01
  • 2015-01-16
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多