首页 > 解决方案 > 移动带有取消选中复选框的行需要从特定行开始

问题描述

我从这里得到了一个脚本,现在我需要一些调整。问题是当我运行脚本时,第 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
}

标签: google-apps-script

解决方案


如果我们可以通过范围递增方式,我发现更容易理解循环,显然它对您的情况没有影响,所以让我们尝试一下。

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() 并且我仍然将数据获取到另一张表,因为我使用了两个数组,一个包含所有数据,一个只有复选框列. 因此,这应该可以解决您的公式问题。


推荐阅读