Googlesheet 脚本 - 填写并按 Enter 后移至下一个字段

问题描述 投票:0回答:2

您能帮我处理 Google 表格中的数据输入表格吗?我需要一个脚本,用于在填写字段并按 Enter 键后移动到下一个空字段。另外,有没有办法将我的数据输入表单中的所有其他未使用的单元格灰显或锁定它们,这样它们就不会被触摸,就像我们不能在它们上面放任何东西一样。 enter image description here

google-apps-script google-sheets
2个回答
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]);
    }
  }
}

注:

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

如果您有一个将单元格复制到主数据表中的脚本,则可以利用范围列表。 (顺便说一句,您可以找到这里如何传输数据)。

编辑:

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

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

enter image description here


0
投票

(注意:这只会解决有关将活动选择移动到下一个空字段的第一个问题。至于单元格的锁定,请为其发布一个单独的问题)。

您可以通过获取工作表上的当前行来尝试组合 Google Sheet onEdit(e) 简单触发器

setActiveSelection
方法和一点逻辑。请参阅下面的示例:

脚本:

function onEdit(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0]; //e.g. Sheet1 tab
  var col = e.range.getA1Notation().split('')[0];

  if (col == 'C' || col == 'F') { // runs only if selection is on col C or col F
    if (e.range.getRow() == 4) { //if user inputs on the search field
      var range = sheet.getRange(col + "" + (e.range.getRow() + 3));
      sheet.setActiveSelection(range);
    } else { //move to the next cells where each rows are in between one empty rows
      var range = sheet.getRange(col + "" + (e.range.getRow() + 2));
      return range.getRow() > (sheet.getDataRange().getLastRow() + 1) ? sheet.setActiveSelection(sheet.getRange('F7')) : sheet.setActiveSelection(range);
    }
  }
}

演示:

  • 每次填充空白字段后按下
    Enter
    键,选择器都会自动移动到下一个空白字段(白色单元格)。

enter image description here

注意:此示例 GIF 以快速播放速度渲染。

限制:

  • 由于此方法调用电子表格应用服务,如果短时间内发生多个触发器,则很有可能会运行不一致/缓慢。
  • 按下
    Enter
    后,选择器会跳转到下一行几秒钟,然后自动移至下一个空白字段。
  • 由于我们无法清楚地了解您的实际工作表,因此仅当工作表上除您提供的示例图像中的数据之外没有其他数据时,此示例才有效。如果这不起作用,如演示所示,请分享您的示例表,以便我们可以正确复制您的设置。
© www.soinside.com 2019 - 2024. All rights reserved.