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)
正如我在评论中提到的,您想要使用一个简单的触发器函数(以便它适用于所有用户,而不需要他们首先授权脚本)。简单触发器自然存在一些限制,但对于您描述的工作流程,它们并不适用。
接收触发器调用的函数的一个关键原则on edit是它有一个事件对象,其中包含有关已编辑的单元格的数据:
- authMode:枚举中的值
ScriptApp.AuthMode。- oldValue:编辑之前的单元格值(如果有)。仅当编辑的范围是单个单元格时才可用。如果单元格没有以前的内容,则将是未定义的。
- range:一个
Range对象,表示已编辑的单元格或单元格范围。- source:一个
Spreadsheet对象,表示脚本绑定到的 Google Sheets 文件。- triggerUid:产生此事件的触发器的 ID(仅限可安装触发器)。
- user:一个
User对象,代表活动用户(如果可用)(取决于一组复杂的安全限制)。- value:编辑后的新单元格值。仅当编辑的范围是单个单元格时才可用。
其中,我们将使用range和value。我将把处理多单元格范围编辑的业务案例留给您。毕竟,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。==因此,使用一般等式。上面的代码不会将空白检查单元格与删除内容的结果等同起来。
方法参考:
| 归档时间: |
|
| 查看次数: |
724 次 |
| 最近记录: |