Google apps script 根据图纸行在给定列中的值移动图纸行

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页 虽然我对应用程序脚本非常陌生,但我能理解为什么它不起作用——我只是不知道如何更改它!当前脚本正在查看已编辑的行,但

我有一个小脚本,它目前可以很好地使用简单的“on edit”触发器,但是我想从菜单中运行它,这样您就可以成批移动行,而不是一次一行。似乎“on edit”触发函数需要几秒钟才能更新,当它重新排列时,您可能会失去在列表中的位置

我的目标是:

  • 从表格收集的数据填充表1
  • 用户将第8行(状态)更改为C或A
  • 选择菜单选项“X”,脚本将行移动到相关工作表
    • “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触发器
    • 菜单动作
    让我们看一下主要动作 看看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;i 要知道,,
    Colno
    应为全局变量

    菜单视图


    这对我来说很好。完整代码。

    嗨,亚历克斯,非常感谢你抽出时间回答我的问题!这很好,但我可以做一些修改。使用您的代码,我现在确实可以手动移动行,但它只会移动选定的行。这意味着我必须多次运行它,而我曾经设想过一些东西,可以在第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()')
        }
    }