【问题标题】:How to make all sheets of a Google spreadsheet show A1 in upper left?如何使谷歌电子表格的所有工作表在左上角显示 A1?
【发布时间】:2020-05-01 11:24:32
【问题描述】:

我有一个 72 页的 Google 电子表格,我正在尝试重置每张表格,以便在您单击其选项卡时它在左上角显示 A1。也就是说,如果一张工作表向下滚动以至于您看不到 A1,我希望它向后滚动以便您可以看到。

我尝试了以下 google 脚本,但没有任何效果。我得到了第 4 个(reset4)from here,但这也没有用。

function reset1() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var allSheets = ss.getSheets();
  for (var i = 1; i < allSheets.length; i++) {
    allSheets[i].setActiveSelection("A1");
  }
}

function reset2() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var allSheets = ss.getSheets();
  for (var i = 1; i < allSheets.length; i++) {
    allSheets[i].setActiveRange(allSheets[i].getRange("A1"));
  }
}

function reset3() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var allSheets = ss.getSheets();
  for (var i = 1; i < allSheets.length; i++) {
    allSheets[i].setCurrentCell(allSheets[i].getRange("A1").getCell(1, 1));
  }
}

// ***** CORRECTION: 
// ***** reset4() later found to work. See accepted answer comments for details

function reset4() {
  SpreadsheetApp.getActive().getSheets().forEach(function (s) {
    s.setActiveSelection("A1");
  });
  SpreadsheetApp.flush(); // may still need to refresh page afterward
}

function reset5(){
  var ss = SpreadsheetApp.getActive();
  var sheets = ss.getSheets();
  sheets.forEach(function(sh){
    sh.activate();
    ss.getActiveSheet().getRange("A1").activate();
  });
}

我根据 Rafa Guillermo 在答案中提供的代码添加了第 5 个(reset5),但这也不起作用。尽管 Rafa Guillermo 的回答有效,但我并不是说每次单击其选项卡时都要重置工作表,但只有在运行所需的功能之后。

下面的动画 .gif 显示了一个测试电子表格,其中包含最后一个函数 (reset5) 和 3 张包含可能行和列的工作表。在视频的开头,单元格 A1(背景为红色)位于每张纸的左上角。然后我向下滚动并选择每个工作表中的其他单元格,以便不再看到 A1。运行该函数后,Sheet3 确实根据需要将 A1 放置在左上角。但是,问题是 Sheet1 和 Sheet2 没有。

【问题讨论】:

  • 关于I got the 4th one (reset4) from here but that didn't work either.,我认为在你reset4的脚本中,当函数运行时,每个工作表的单元格“A1”被激活,每个选项卡按顺序打开。对于这种情况,能否请教一下与am trying to reset each sheet so that it shows A1 in the upper left when you click on its tab.的区别?
  • @Tanaike 我在第一段中添加了一个句子,以使我的意思(希望)更清楚。例如,我有许多向下滚动的工作表,因此当您单击它们的选项卡时看不到 A1。我希望所有这些都向上滚动,这样当我单击选项卡时,我会看到顶部 A1。
  • 感谢您的回复。当setActiveSelection("A1") 运行时,单元格“A1”被选中并聚焦。关于scroll back,这和你期望的结果不同。我的理解正确吗?
  • 感谢您的回复。我为我糟糕的英语水平深表歉意。关于Is my understanding correct?,我问我是否能正确理解你的问题。

标签: google-apps-script google-sheets


【解决方案1】:

答案:

设置好每张工作表的活动范围后,需要使用SpreadsheetApp.flush()

注意: 此答案是在提供更多信息后编辑的,原始答案位于中断下方。

更多信息:

如果我正确理解你的情况,你希望有一个函数:

  • 不在触发器上运行。
  • 运行时,将其附加到单元格A1 的电子表格中所有工作表的活动单元格重置。

有了这些参数,我相信你在问题中提供的函数reset4()确实有效。现在,Google 表格在绑定脚本文件时确实有一些奇怪的行为,有时如果两者都打开并且长时间无人看管,脚本选项卡将“失去”它与电子表格的绑定状态;这可以通过重新加载电子表格来解决(从 UI 的角度来看,它还会将所有工作表中的活动单元格重置为 A1,但我们暂时将其放在一边)。

代码:

作为对我之前回答中脚本修改的修改,您可以运行reset5() 函数,但在activate() 调用之后添加SpreadsheetApp.flush()

function reset() {
  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
  var range;
  sheets.forEach(function(sh) {
    range = sh.getRange("A1");
    range.activate();
    SpreadsheetApp.flush();
  });
}

参考资料:


上一个答案:

您可以使用 Apps Script 中的onSelectionChange(e) 触发器在标签更改时将当前工作表的活动单元格更改为A1

更多信息:

根据Simple Triggers documentation

当用户更改电子表格中的选择时,onSelectionChange(e) 触发器会自动运行。大多数onSelectionChange(e) 触发器使用事件对象中的信息进行适当的响应。

代码示例:

您可以将当前活动工作表存储在PropertiesService 属性中,并在活动选择更改时将其与新活动工作表进行比较。然后,您可以在此处将活动单元格更改为该工作表的A1

function onSelectionChange(e) {
  var lastSheet = PropertiesService.getUserProperties().getProperty("LastActiveSheet");
  if (e.source.getActiveSheet().getName() == lastSheet) {
    return;
  }
  else {
    PropertiesService.getUserProperties().setProperty("LastActiveSheet", e.source.getActiveSheet().getName())
    SpreadsheetApp.getActiveSheet().getRange("A1").activate();
  }
}

参考资料:

【讨论】:

  • 感谢@Rafa Guillermo 提供的一些很酷的代码,但这不是我想要的。我的短语“当您单击其选项卡时”并不意味着触发事件,而是当我展示的 4 个功能之一运行时,所有工作表都将重置为 A1。只有在“当您单击其选项卡时”之后,您才会看到运行该功能的结果。根据您的代码,我添加了另一个函数(reset5)来尝试做我想做的事,但它也没有工作。您的代码有效,但我不希望每次单击其选项卡时都重置工作表,但仅在运行所需的功能之后
  • 我想我不明白你的情况。您问题中的所有功能在运行时会将活动单元格重置为 A1。您究竟希望函数在什么时候运行,以及它究竟要做什么?请尽量简洁。
  • 我现在在我的帖子@Rafa Guillermo 中添加了一个动画 .gif。此测试电子表格有 3 张纸和“reset5”的代码。我想要发生的事情发生在 Sheet3 但不是 Sheet1 或 Sheet2
  • reset4 绝对对我有用,如果我理解你所描述的。我已经用 reset5 的新修改版本更新了我的答案,我相信它应该可以工作。
  • 感谢@Rafa Guillermo 的完整回答。我学到了很多东西。我确认它现在可以与“reset4”和您提供的答案一起使用。也许 reset4 最初对我不起作用是因为您提到的“奇怪行为”,因为我的 72 个选项卡电子表格确实“打开并且长时间无人看管”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
相关资源
最近更新 更多