Google apps script 根据图纸行在给定列中的值移动图纸行
我有一个小脚本,它目前可以很好地使用简单的“on edit”触发器,但是我想从菜单中运行它,这样您就可以成批移动行,而不是一次一行。似乎“on edit”触发函数需要几秒钟才能更新,当它重新排列时,您可能会失去在列表中的位置 我的目标是:Google apps script 根据图纸行在给定列中的值移动图纸行,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我有一个小脚本,它目前可以很好地使用简单的“on edit”触发器,但是我想从菜单中运行它,这样您就可以成批移动行,而不是一次一行。似乎“on edit”触发函数需要几秒钟才能更新,当它重新排列时,您可能会失去在列表中的位置 我的目标是: 从表格收集的数据填充表1 用户将第8行(状态)更改为C或A 选择菜单选项“X”,脚本将行移动到相关工作表 “C”->第2页 “A”->第3页 虽然我对应用程序脚本非常陌生,但我能理解为什么它不起作用——我只是不知道如何更改它!当前脚本正在查看已编辑的行,但
- “C”->第2页
- “A”->第3页
function onEdit(event) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = event.source.getActiveSheet();
var r = event.source.getActiveRange();
var Colno = 8 //Column to be checked
if (s.getName() == "Sheet1" && r.getColumn() == Colno && r.getValue() == "C") {
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Sheet2");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).moveTo(target);
s.deleteRow(row);
} else if (s.getName() == "Sheet1" && r.getColumn() == Colno && r.getValue() == "A") {
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Sheet3");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).moveTo(target);
s.deleteRow(row);
}
}
您需要分离程序的操作
- 主要行动
- onEdit触发器
- 菜单动作
function onEditTrg(event) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = event.source.getActiveSheet();
var r = event.source.getActiveRange();
mover(s, r);
}
菜单动作
额外的
作为补充,我建议使用onEdit触发器开关
function onOpen() {
SpreadsheetApp.getUi().createMenu('Mover')
.addItem('Move current', 'menuCall')
.addItem('Switch onEdit()', 'switchOnEdit')
.addToUi();
}
function switchOnEdit() {
var isExist = false;
var tgrs = ScriptApp.getUserTriggers(SpreadsheetApp.getActiveSpreadsheet());
for (var i = 0; i < tgrs.length; i++) {
if (tgrs[i].getHandlerFunction() == 'onEditTrg' && tgrs[i].getEventType() == ScriptApp.EventType.ON_EDIT) {
isExist = true;
ScriptApp.deleteTrigger(tgrs[i]);
}
}
if (isExist) {
SpreadsheetApp.getActiveSpreadsheet().toast('onEdit() is off', 'Switcher onEdit()')
} else {
ScriptApp.newTrigger('onEditTrg')
.forSpreadsheet(SpreadsheetApp.getActiveSpreadsheet())
.onEdit()
.create();
SpreadsheetApp.getActiveSpreadsheet().toast('onEdit() is on', 'Switcher onEdit()')
}
}
函数onOpen(){
SpreadsheetApp.getUi().createMenu('Mover')
.addItem('当前移动','菜单调用')
.addItem('Switch-onEdit()','Switch-onEdit')
.addToUi();
}
函数switchOnEdit(){
var isExist=false;
var tgrs=ScriptApp.getUserTriggers(SpreadsheetApp.getActiveSpreadsheet());
对于(变量i=0;iColno
应为全局变量
菜单视图
这对我来说很好。完整代码。嗨,亚历克斯,非常感谢你抽出时间回答我的问题!这很好,但我可以做一些修改。使用您的代码,我现在确实可以手动移动行,但它只会移动选定的行。这意味着我必须多次运行它,而我曾经设想过一些东西,可以在第8列中用X移动所有行。这有意义吗?谢谢
function menuCall() {
var s = SpreadsheetApp.getActiveSheet();
var r = SpreadsheetApp.getActiveRange();
mover(s, r);
}
function onOpen() {
SpreadsheetApp.getUi().createMenu('Mover')
.addItem('Move current', 'menuCall')
.addItem('Switch onEdit()', 'switchOnEdit')
.addToUi();
}
function switchOnEdit() {
var isExist = false;
var tgrs = ScriptApp.getUserTriggers(SpreadsheetApp.getActiveSpreadsheet());
for (var i = 0; i < tgrs.length; i++) {
if (tgrs[i].getHandlerFunction() == 'onEditTrg' && tgrs[i].getEventType() == ScriptApp.EventType.ON_EDIT) {
isExist = true;
ScriptApp.deleteTrigger(tgrs[i]);
}
}
if (isExist) {
SpreadsheetApp.getActiveSpreadsheet().toast('onEdit() is off', 'Switcher onEdit()')
} else {
ScriptApp.newTrigger('onEditTrg')
.forSpreadsheet(SpreadsheetApp.getActiveSpreadsheet())
.onEdit()
.create();
SpreadsheetApp.getActiveSpreadsheet().toast('onEdit() is on', 'Switcher onEdit()')
}
}