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



我正在为Google Sheets在App script中编写脚本。电子表格包含两个表格,每个表格上都有一个按钮。点击第一张表格上的按钮会将您带到第二张表格。点击第二张图片上的按钮,你就会回到第一张图片。

这听起来很简单,但是当我回到每个工作表时,我无法恢复光标位置。它总是变成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);

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

代码:

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将始终获得活动表的活动单元格。它无法获取非活动表单的活动单元格

相关内容

最新更新