取消选中复选框移动行需要从特定行开始

时间:2019-05-03 23:05:30

标签: google-apps-script

我从这里获得了一个脚本,现在我需要进行一些调整。 问题是当我运行脚本时,第11行以上的所有行从动态变为静态,公式都消失了。 我不知道为什么脚本不读取并移至第11行以下。

function moveRows() {
  var sss=SpreadsheetApp.getActive();
  var tss=SpreadsheetApp.openById("Target Spreadsheet Id"); 
  var ssh=sss.getSheetByName('Source Sheet Id');
  var srg=ssh.getDataRange();
  var svA=srg.getValues();
  var tsh=tss.getSheetByName('Target Sheet Id');  
  var oA=[];//output array for rows that meet criteria
  for(var i=svA.length-1;i>12; i--) {
    if (svA[i][21]==true) { //column 22
      oA.push(svA[i].slice()); //this copies the row array
      svA[i][21]=false; //uncheck checkbox    
    }
  }
  tsh.getRange(tsh.getLastRow()+1,1,oA.length,oA[0].length).setValues(oA);//load target sheet with rows with check boxes checked       
  srg.setValues(svA);//save values in source sheet
}

1 个答案:

答案 0 :(得分:0)

我发现,如果我们可以扩大范围,显然对循环的理解就容易多了,而且显然对您的情况没有影响,所以请尝试一下。

function moveRows() {
  var sss=SpreadsheetApp.getActive();
  var tss=SpreadsheetApp.openById("SpreadsheetId"); 
  var ssh=sss.getSheetByName('Sheet1');
  var srg=ssh.getRange(2,22,ssh.getLastRow()-1,1);//just column 22
  var srg1=ssh.getRange(2,1,ssh.getLastRow()-1,ssh.getLastColumn());//all columns for sending data to other spreadsheet.  This wont send formulas
  var svA1=srg1.getValues();
  var svA=srg.getValues();
  var tsh=tss.getSheetByName('Sheet1');  
  var oA=[];//output array for rows that meet criteria
  for(var i=0;i<svA.length; i++) {
    if (svA[i][0]==true) { //column 22
      oA.push(svA1[i].slice());
      svA[i][0]=false;//uncheck checkbox    
    }
  }
  tsh.getRange(tsh.getLastRow()+1,1,oA.length,oA[0].length).setValues(oA);//load target sheet with rows with check boxes checked
  srg.setValues(svA);//save values in source sheet 
}

那么,您要循环遍历的确切范围是多少?什么行?什么是列?哪一列具有复选框?

现在我看到的另一个问题可能是您有要保留的公式,这样当我们重置复选框时,我们应该只重置该列。

在此版本中,我仅在具有复选框的列中执行setValues(),但由于我使用的是两个数组,一个数组包含所有数据,而另一个数组仅包含数组,因此我仍然将数据发送到另一张表复选框列。这样就可以解决您的公式问题。