簡體   English   中英

谷歌表格應用腳本更改工作表並保持相同的活動單元格

[英]Google Sheets App Script to change sheet and keep same active cell

我正在 App Script 中為 Google Sheets 編寫腳本。 該電子表格包含兩個工作表,每個工作表上都有一個按鈕。 單擊第一張紙上的按鈕會將您帶到第二張紙。 單擊第二個按鈕將帶您回到第一個。

這聽起來很簡單,但是當我將 go 恢復到每張紙時,我無法將 cursor position 恢復。 它總是改為 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應該恢復之前的活動選擇和 cursor position。 如果您在單個 function 中完成所有操作,這似乎可以正常工作。 當這里有兩個單獨的功能時,它不起作用。

這大概與上下文有關,誰可以看到什么數據。 我通過讓用戶單擊每個工作表中的按鈕來從相同的用戶上下文運行這兩個腳本。 我怎樣才能讓它工作?

請注意,它只有在同一個 function 中才有效。 由於 session 仍然具有以前的數據。 當 function 停止時,您無法知道之前的選擇在哪里。

示例代碼顯示它只是返回到工作表上一個激活的單元格。

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

我可以建議您在 session 結束之前創建另一個表來存儲他們以前的活動單元格。

代碼:

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

補充說明:

  • 您可以在創建記錄表后隱藏它。
  • 如果尚未記錄,則默認 go 到 A1。
  • getActiveCell將始終獲取活動工作表的活動單元格。 它無法獲取非活動表的活動單元格。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM