根据单元格编辑在工作表之间移动行+通过列查找找到的空白行不是完整行

时间:2019-02-14 22:57:55

标签: google-apps-script google-sheets

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

我正在为我和我妻子的手工“业务”(项目)建立订单系统。从本质上讲,当我在X列中输入“完成”时,需要将订单1(列aw)从“准备发货”移到“已发送”的下一个空白行上,将wz列中的公式打折。空白行,则应仅检查aw列。

这意味着,一旦订单信息移到新表上,我们就会在这些列中添加其他功能(如果订单过迟,我会把它连接起来发送一封电子邮件道歉-希望不会,但最好是用我们的邮政服务做好准备:))

Sample sheet here.

最初,我学会了如何在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);
   }
  }
  }
  }

3 个答案:

答案 0 :(得分:0)

我认为您想要使用getDisplayValues。这样既可以解决您的问题(公式不是空白问题(请确保您的公式在未使用该行时显示空白),也可以解决我的数字问题)。

尝试:

moveMe = [];
rowArray = s.getRange(row,1,1,10).getDisplayValues();
moveMe.push(rowArray);
targetSheet.appendRow(moveMe);
s.deleteRow(row);

您可能需要稍微摔跤appendRow,但这是最干净的。如果仍然无法正常运行,请尝试跳过推送步骤并执行

targetSheet.appendRow(rowArray);

更好(编辑):

您需要先将数据行更改为:

var data = sheet.getRange(1, "A", numRows).getDisplayValues();

,然后您只需执行以下操作即可:

targetSheet.appendRow(data[i]);
s.deleteRow(row);

答案 1 :(得分:0)

此功能接受一个编辑事件,并检查已编辑的值是否已更改为“已发送”。然后,将该行复制到同一电子表格中的已发送工作表中,并保持这些值。

function onEdit(e){
  if(e.value != 'Sent') return false; //If not changed to 'Sent' then stop.

  var range = e.range; //get the range the edit occured in.
  if(range.getColumn() != 25) return false;//see if it was column number 25, ie. Column Y

  var sheet = range.getSheet();
  if(sheet.getName() != 'Ready To Send') return false;

  var editedRow = sheet.getRange(range.getRow(), 1, 1, sheet.getMaxColumns()); //Select the row.

  var sent = sheet.getParent().getSheetByName('Sent');
  sent.appendRow(editedRow.getValues()[0]);  //Copy row to Sent sheet.

  sheet.deleteRow(range.getRow()); //Deleted the original row
}

答案 2 :(得分:0)

尝试一下:

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);
  }
}