![](/img/trans.png)
[英]Google Docs Script: Move cell to two other sheets onEdit but no duplicates
[英]Google Sheets move cursor onEdit trigger based on cell content
我正在尝试编写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);
}
}
正如我在评论中提到的,您希望使用一个简单的触发器函数(这样它就适用于所有用户,而不需要他们首先授权脚本)。 简单触发器自然存在一些局限性 ,但对于您描述的工作流程,它们并不适用。
接收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;
}
}
在您消化上述内容时,您会注意到您需要提供特定于您自己的工作流程的某些值,例如工作表名称和正确的列。 如果编辑的列是若干列之一,则使用对相应“检查”列的常量偏移或分别排序的偏移/目标列的数组,可以以相当简单的方式修改上述内容以向右前进。 (这样的修改几乎肯定需要使用Array#indexOf
。)
需要注意的是,如果您的编辑数字可以表示为整数,则严格相等===
失败,因为Google表格会将数字存储为浮点数。 严格的相等性排除了类型转换,并且没有int
可以与float
完全相同。 因此,使用通用等式==
。 上述代码不会等同于空白检查单元格和删除内容的结果。
方法参考:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.