Google表格根据单元格内容移动光标onEdit触发器

719*_*016 5 google-sheets google-apps-script

我正在尝试编写Google表格应用程序脚本功能,该功能检查当前活动单元格的内容,将其与另一个单元格的内容进行匹配,然后根据该检查的结果移动光标.

对于此示例的电子表格:https: //docs.google.com/spreadsheets/d/1kpuVT1ZkK0iOSy_nGNPxvXPTFJrX-0JgNmEev6U--5c/edit#gid=0

我希望用户转到D2,输入一个值后跟Tab,然后当活动单元格在E2时,该函数将检查D2中D2中的值是否相同.如果是,请留在E2.然后我们在E2中输入值,然后输入Tab,函数检查它是否与C2相同,如果是,则从F2向下移动并向左移动两次到D3.因此,如果正确输入了所有值,则光标在D,E和F中的单元格之间曲折,如下所示:

在此输入图像描述

我能找到的最接近的是下面的答案,但它涉及每次点击菜单中的方法:

根据给定列中的值移动工作表行

我想这个函数可以在编辑文档开始时触发,然后它继续移动光标直到文档完成,此时函数可以停止.

有任何想法吗?

编辑:到目前为止我尝试过:

我已设法将位置更改为硬编码位置'D3'并创建一个功能,使用这些功能向下移动一个:

function onOpen() {
  var m = SpreadsheetApp.getUi().createMenu('Move');
  m.addItem('Move to D3', 'move').addToUi();
  m.addItem('Move to one below', 'move2').addToUi();
  m.addItem('Move down left', 'move_down_left').addToUi();
}

function move() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getActiveSheet();
  var range = s.getRange('D3');
  s.setActiveRange(range);  
}

function move2() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getActiveSheet();
  var r = s.getActiveRange();
  var c = r.getCell(1,1);
  var target = s.getRange(c.getRow() + 1, c.getColumn());
  s.setActiveRange(target);
}

function move_down_left() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getActiveSheet();
  var r = s.getActiveRange();
  var c0 = r.getCell(1,1);
  var r1 = s.getRange(c0.getRow(), c0.getColumn() - 1);
  var c1 = r1.getCell(1,1);
  var r2 = s.getRange(c1.getRow(), c1.getColumn() - 2);
  var c2 = r2.getCell(1,1);
  if (c1.getValue() == c2.getValue()) {
    var target = s.getRange(c1.getRow() + 1, c1.getColumn() - 1);
    s.setActiveRange(target);
  }
}
Run Code Online (Sandbox Code Playgroud)

teh*_*wch 2

正如我在评论中提到的,您想要使用一个简单的触发器函数(以便它适用于所有用户,而不需要他们首先授权脚本)。简单触发器自然存在一些限制,但对于您描述的工作流程,它们并不适用。

接收触发器调用的函数的一个关键原则on edit是它有一个事件对象,其中包含有关已编辑的单元格的数据:

  • authMode:枚举中的值ScriptApp.AuthMode
  • oldValue:编辑之前的单元格值(如果有)。仅当编辑的范围是单个单元格时才可用。如果单元格没有以前的内容,则将是未定义的。
  • range:一个Range对象,表示已编辑的单元格或单元格范围。
  • source:一个Spreadsheet对象,表示脚本绑定到的 Google Sheets 文件。
  • triggerUid:产生此事件的触发器的 ID(仅限可安装触发器)。
  • user:一个User对象,代表活动用户(如果可用)(取决于一组复杂的安全限制)。
  • value:编辑后的新单元格值。仅当编辑的范围是单个单元格时才可用。

其中,我们将使用rangevalue。我将把处理多单元格范围编辑的业务案例留给您。毕竟,Stack Overflow 并不是您获得交钥匙解决方案的地方;)

function onEdit(e) {
  if (!e) throw new Error("You ran this from the script editor");
  const edited = e.range;
  if (edited.getNumRows() > 1 || edited.getNumColumns() > 1)
    return; // multicell edit logic not included.

  const sheet = edited.getSheet();
  if (sheet.getName() !== "your workflow sheet name")
    return;

  // If the user edited a specific column, check if the value matches that
  // in a different, specific column.
  const col = edited.getColumn(),
      advanceRightColumn = 5,
      rightwardsCheckColumn = 2;
  if (col === advanceRightColumn) {
    var checkedValue = edited.offset(0, rightwardsCheckColumn - col, 1, 1).getValue();
    if (checkedValue == e.value) // Strict equality may fail for numbers due to float vs int
      edited.offset(0, 1, 1, 1).activate();
    else
      edited.activate();
    return;
  }

  const endOfEntryColumn = 8,
      endCheckColumn = 3,
      startOfEntryColumn = 4;
  if (col === endOfEntryColumn) {
    var checkedValue = edited.offset(0, endCheckColumn - col, 1, 1).getValue();
    if (checkedValue == e.value)
      edited.offset(1, startOfEntryColumn - col, 1, 1).activate();
    else
      edited.activate();
    return;
  }
}
Run Code Online (Sandbox Code Playgroud)

当您消化上述内容时,您会注意到您需要提供特定于您自己的工作流程的某些值,例如工作表名称和正确的列。如果编辑的列是多个列之一,则可以使用相对“检查”列的常量偏移量或分别排序的偏移量/目标列的数组,以相当简单的方式修改上述内容以向右前进。(这样的修改几乎肯定需要使用Array#indexOf。)

我注意到的一个警告是,===如果您编辑的是可表示为整数的数字,则严格相等会失败,因为 Google 表格会将数字存储为浮点数。根据定义,严格相等排除了类型转换,并且任何int值都不可能与 完全相同float==因此,使用一般等式。上面的代码不会将空白检查单元格与删除内容的结果等同起来。

方法参考: