首页 > 解决方案 > 基于单元格编辑在工作表之间移动行 + 通过列查找找到的空白行不是整行

问题描述

我已经为此工作了几天,并将互联网和这些论坛颠倒过来,但在任何地方都找不到答案。在此过程中,我学习了一些脚本,但确定我需要做的事情远远超出了我的极限。任何帮助或指导都会受到好评!

我正在为我和我妻子的手工“生意”(项目)建立一个订单系统。本质上,当在 X 列中输入“完成”时,我需要将订单 1(aw 列)从“准备发货”移动到“已发送”的下一个空白行,从而对 wz 列中的公式进行折扣。所以当它检查一个空白行,它应该只检查列 aw。

这意味着一旦订单信息转移到新工作表上,我们在这些列中添加了额外的功能(我连接它以发送电子邮件道歉,如果订单迟到 - 希望不会,但最好做好准备,与我们的邮政服务:) )

样品表在这里。

我最初学习了如何在 x 列中添加值时编写“移动行” - 并了解了触发器以及如何调用工作表等。

然后,因为 x、y 和 z 列有公式,所以当我移动整行时,我要么最终删除它们 - 不酷。或者我最终(如果我只移动列 a-w)有新的(移动的)行,显示在第 900 万行,因为它认为公式不是空白行。我尝试编辑“基于列查找行”脚本,这似乎工作正常,但后来我尝试将两者放在一起,这就是它爆炸的时候。

谁能告诉我这里哪里出错了?

function lastRowForColumn(sheet, column){
  // Get the last row with data for the whole sheet.
   var ss = spreadSheetApp.getActiveSpreadSheet();// this gets you the 
 active spreadsheet in which you are working   
   var sheet = ss.getSheetByName('Sent');
   var r = event.source.getActiveRange();
   var data = sheet.getRange(1, "A", numRows).getValues();
   var numRows = sheet.getLastRow();
  // Iterate backwards and find first non empty cell
  for(var i = data.length - 1 ; i >= 0 ; i--){
    if (data[i][0] != null && data[i][0] != ""){
    return i + 1;

     var ss = spreadSheetApp.getActiveSpreadSheet();// this gets you the 
      active spreadsheet in which you are working   
      var sheet = ss.getSheetByName('Sent');
      var r = event.source.getActiveRange();

        if(s.getName() == "Ready To Send" && r.getColumn() == 25 && 
    r.getValue() == "Sent") {
     var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("Sent");
   var lastRow = lastRowForColumn();
    var target = targetSheet.getRange(targetSheet, i, 1);
    s.getRange(row, 1, 1, 10).moveTo(target);
   s.deleteRow(row);
   }
  }
  }
  }

标签: google-apps-scriptgoogle-sheets

解决方案


尝试这个:

function onEdit(e){
  var rg=e.range;
  var sh=rg.getSheet();
  var name=sh.getName();
  var col=rg.columnStart; 
  if(name!='Sheet To Send'){return;}
  if(col==24 && e.value=='done') {
    var ss=e.source;
    var sheet=ss.getSheetByName('Sent');
    var row=rg.rowStart;
    var srg=sh.getRange(row,1,1,23);
    var data=srg.getValues();
    var drg=sheet.getRange(sheet.getLastRow()+1,1,1,23);
    drg.setValues(data);
    sh.deleteRow(row);
  }
}

推荐阅读