【问题标题】:automatically move to the next cell on the page自动移动到页面上的下一个单元格
【发布时间】:2022-06-25 14:25:39
【问题描述】:

我有一个我在 Google 表格中设计的电子表格,用于输入工作数据,然后是一个公式,用于确定是否需要更换部件并提供所需的部件号。我需要一个宏或 appScript,它将从同一张表上的某个单元格开始,突出显示它,允许我在其中键入一个值,然后按 ENTER 或 TAB 键移动到页面上的下一个单元格(不一定是隔壁单元格,而是另一列和/或行中的单元格),-AND- 基于数据验证复选框确定选择了哪些单元格。如何编写宏或 appScript 来做我需要的事情?哪个更容易?

【问题讨论】:

  • 我认为在这种情况下宏可能更容易,因为您的用例是交互式的。可以选择在相对单元格意义上配置宏,这将允许您选择起始单元格。不确定“下一个单元格”是什么意思(在您的情况下是如何定义的)?
  • 没有真正的区别...在谷歌表格中录制宏只是创建一个应用脚本。

标签: google-apps-script google-sheets


【解决方案1】:

参考

sheet.setActiveSelection()

脚本:

试试

function onEdit(event){ 
  var sh = event.source.getActiveSheet();
  var rng = event.source.getActiveRange();
  if (sh.getName() == 'mySheetName'){                          // adapt
    var addresses = ["E7","H7","E10","H10","E13","H13","E16"]; // adapt
    var values = addresses.join().split(",");
    var item = values.indexOf(rng.getA1Notation());
    if (item < addresses.length - 1){ 
      sh.setActiveSelection(addresses[item + 1]);
    }
  }
}

注意:

这样您可以确定选择单元格的顺序。

如果您有将单元格复制到主数据表的脚本,则可以利用范围列表。 (对了,你可以找到here如何传输数据)。

如果是受保护的工作表:

如果您的工作表受到保护,除了需要填写的单元格之外,您可以使用脚本来搜索它们并重新组织它们。

function onEdit(event) {
  var sh = event.source.getActiveSheet();
  var rng = event.source.getActiveRange();
  if (sh.getName() == 'mySheetName') {            // adapt
    var addresses = listOfUnprotectedRanges()
    var values = addresses.join().split(",");
    var item = values.indexOf(rng.getA1Notation());
    if (item < addresses.length - 1) {
      sh.setActiveSelection(addresses[item + 1]);
    }
  }
}
function listOfUnprotectedRanges() {
  var p = SpreadsheetApp.getActiveSheet().getProtections(SpreadsheetApp.ProtectionType.SHEET)[0];
  var ranges = p.getUnprotectedRanges().map(r => [r.getA1Notation(), r.getRow(), r.getColumn()])
  ranges = ranges.sort(function (a, b) { return a[2] - b[2]; }); // sort by columns 
  ranges = ranges.sort(function (a, b) { return a[1] - b[1]; }); // sort by ranges first
  return ranges.map(r => r[0])
}

【讨论】:

  • 我的工作表受到保护,但某些需要编辑的单元格除外。我对 appScripts 很陌生,知道的很少(但愿意学习)。我正在运行您为受保护工作表推荐的第二个脚本。我收到一条错误消息,TypeError: Cannot read property 'source' of undefined onEdit @ dataEntry.gs:8
  • 您不需要在脚本编辑器中自己运行脚本。当您在未受保护的单元格中输入值时,此脚本将自动执行。
  • 它不工作,我不知道为什么。我的第一个不受保护的字段是 B1,下一个不受保护的字段是 E1,然后是 B2:E2,下一个 G2,下一个 I2,下一个 J2,下一个 J2,下一个 B3,下一个 E4,下一个 E5……如果我能让这些工作我我想我可以对要使用的其余单元进行编程。我想在每个单元格中输入信息,按 ENTER 移动到下一个单元格,输入信息并按 ENTER 转到下一个单元格...我希望每个单元格在准备好信息时突出显示为某种颜色输入,然后按 ENTER 后恢复为原始颜色。
  • 您是尝试第一个脚本还是使用受保护工作表的第二个脚本?您能否分享您的电子表格或至少一个可重现的最小示例?
  • 我将上面的 OnEdit 函数复制并粘贴到我的 appScript 中,将“mysheetname”更改为工作表名称。我在“var rng = event.source.getActiveRange();”这一行遇到错误说“TypeError:无法读取未定义 onEdit @ dataEntry.gs:8 的属性'源'”如何解决这个问题?
猜你喜欢
  • 2016-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多