If statement 事件触发器,根据两列中的值将行移动到其他两个工作表之一

If statement 事件触发器,根据两列中的值将行移动到其他两个工作表之一,if-statement,google-apps-script,If Statement,Google Apps Script,我是谷歌应用程序脚本的新手,需要一些帮助 我有一个名为Start的电子表格,它有一个带有复选框的Received列。如果复选框被编辑为true,我可以将行移动到另一个工作表,但我需要添加一个条件 如果接收的列被编辑为true,并且位置为Store,则我希望将该行移动到Target1工作表。如果接收的列被编辑为true,且位置为Area,则我希望将该行移动到Target2工作表 以下是指向我的测试电子表格的链接: 以下是我到目前为止的脚本: function onEdit(event) {

我是谷歌应用程序脚本的新手,需要一些帮助

我有一个名为Start的电子表格,它有一个带有复选框的Received列。如果复选框被编辑为true,我可以将行移动到另一个工作表,但我需要添加一个条件

如果接收的列被编辑为true,并且位置为Store,则我希望将该行移动到Target1工作表。如果接收的列被编辑为true,且位置为Area,则我希望将该行移动到Target2工作表

以下是指向我的测试电子表格的链接:

以下是我到目前为止的脚本:

function onEdit(event) {
  // assumes source data in sheet named main
  // target sheet of move to named Completed
  // getColumn with check-boxes is currently set to colu 4 or D
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();

  if(s.getName() == "Start" && r.getColumn() == 4 && r.getValue() == true) {
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet1 = ss.getSheetByName("Target1");
    var targetSheet2 = ss.getSheetByName("Target2");
    var target1 = targetSheet1.getRange(targetSheet1.getLastRow() + 1, 1);
    var target2 = targetSheet2.getRange(targetSheet2.getLastRow() + 1, 1);
    var locationStore = ss.getSheetByName("Start") && r.getColumn() == 3 && r.getValue() == "Store"; 
    var locationArea = ss.getSheetByName("Start") && r.getColumn() == 3 && r.getValue() == "Area"; 
    if (locationStore) {
    s.getRange(row, 1, 1, numColumns).moveTo(target1);
    s.deleteRow(row);
    } if (locationArea) {
    s.getRange(row, 1, 1, numColumns).moveTo(target2);
    s.deleteRow(row);
    }
  } 
}
希望有人有解决办法!提前感谢您的帮助

试试这个:

由于您的操作涉及更改用户数据,因此您可能要求这是一个可安装的触发器,如果您确实使其可安装,请将其名称更改为OneEdit以外的名称,以便简单触发器不会激活它

function onMyEdit(e) {
  e.source.toast('Entry');
  var sh=e.range.getSheet();
  sh.getRange('A23').setValue(JSON.stringify(e));
  if(sh.getName()=="Sheet14" && e.range.columnStart==4 && e.value=="TRUE") {
    e.source.toast('Flag1');
    e.range.setValue('FALSE');
    var tsh1=e.source.getSheetByName("Target1");
    var tsh2=e.source.getSheetByName("Target2");
    var trg1=tsh1.getRange(tsh1.getLastRow()+1,1);
    var trg2=tsh2.getRange(tsh2.getLastRow()+1,1);
    if (e.range.offset(0,-1).getValue()=="Store") {
      sh.getRange(e.range.rowStart,1,1,sh.getLastColumn()).moveTo(trg1);
      sh.deleteRow(e.range.rowStart);
    }else if (e.range.offset(0,-1).getValue()=="Area") {
      sh.getRange(e.range.rowStart,1,1,sh.getLastColumn()).moveTo(trg2);
      sh.deleteRow(e.range.rowStart);
    }
  } 
}

这当然是可以实现的,你走的是正确的道路。根据@Cooper的答案构建,并使用onEdit可安装触发器来运行函数myOnEdite

下面是一个示例代码,可以满足您的需要:

例子: 函数onmyedit{ //记录事件 console.logJSON.stringifye; //获取事件范围 var sh=e.range.getSheet; //检查是否收到了一些东西 ifsh.getName==Start&&e.range.columnStart==4&&e.value==TRUE{ //检查它是否在商店里 ifsh.getRange.range.rowStart,3.getValue==Store{ //展示吐司 e、 source.toast'存储中收到的内容\n移动到Target1表; //在Target1工作表中获取要移动到的目标行 var tsh=e.source.getSheetByNameTarget1; var trg=tsh.getRangetsh.getLastRow+1,1; //将行移动到目标 sh.getrange.range.rowStart,1,1,sh.getLastColumn.movetotg; //删除该行 sh.deleteRowe.range.rowStart; } //检查它是否在该区域 else ifsh.getRange.range.rowStart,3.getValue==区域{ //展示吐司 e、 source.toast“区域中接收到某物。\n移动到Target2工作表”; //在Target2工作表中获取要移动到的目标行 var tsh=e.source.getSheetByNameTarget2; var trg=tsh.getRangetsh.getLastRow+1,1; //将行移动到目标 sh.getrange.range.rowStart,1,1,sh.getLastColumn.movetotg; //删除该行 sh.deleteRowe.range.rowStart; } } } 正在运行的脚本:
这是对我有效的解决方案:

函数onEdite{ //记录事件 console.logJSON.stringifye; //获取事件范围 var sh=e.range.getSheet; //检查是否收到了一些东西 ifsh.getName==Start&&e.range.columnStart==4&&e.value==TRUE{ //检查它是否在商店里 ifsh.getRange.range.rowStart,3.getValue==Store{ //展示吐司 e、 来源:toast“商店里收到的东西”; //在Target1工作表中获取要移动到的目标行 var tsh=e.source.getSheetByNameTarget1; var trg=tsh.getRangetsh.getLastRow+1,1; //将行移动到目标 sh.getrange.range.rowStart,1,1,sh.getLastColumn.movetotg; //删除该行 sh.deleteRowe.range.rowStart; } //检查它是否在该区域 else ifsh.getRange.range.rowStart,3.getValue==区域{ //展示吐司 e、 source.toast“区域中接收到某物。\n移动到Target1工作表”; //在Target2工作表中获取要移动到的目标行 var tsh=e.source.getSheetByNameTarget2; var trg=tsh.getRangetsh.getLastRow+1,1; //将行移动到目标 sh.getrange.range.rowStart,1,1,sh.getLastColumn.movetotg; //删除该行 sh.deleteRowe.range.rowStart; } } }
如果您能提供您的标签和图像,我将很乐意为您提供帮助。为什么我想要一个图片…因为我不喜欢从这个网站的电子表格链接。谢谢你!我试过了,但还是不行。当我将received列更新为true时,我希望记录根据Location列中的值从开始工作表移动到目标工作表之一,但什么也没有发生。请提供请求的图像。仅添加到原始文章的顶部:你需要让它成为一个可安装的触发器,我做了一个小小的改变。e、 值==条件的真值。请不要,我也更改了你的目标工作表的名称。还有一个调整,因为它正在移动和删除两行,我需要在底部添加else if。看来它现在起作用了。这起作用了!!我需要做的唯一改变是使用onEdite而不是OnMyDite。非常感谢你!