Google Script - 陷入搜索和写入循环,无需搜索整个文档

时间:2012-10-18 16:53:52

标签: google-apps-script

我正在尝试创建一个在Google电子表格中运行的脚本,该电子表格会在一个电子表格中扫描工作表,找到与我的IF匹配的每一行,然后只将那些匹配的行写入另一个电子表格。 我完全是脚本的新手,但是拼凑了一些东西。 到底是什么,我不确定。 这是一个笨拙的混乱,但我觉得它接近工作。

我遇到的问题:(除了不知道舔javascript):

我觉得它不会搜索整个源表的范围。 它找到第一个真实条件,然后继续将其写入目标表。 过度。并结束。结束。

使用以下相似的结果:

for(n=0;n<data.length;++n){ 
if (data[n][13]=="yes"&&data[n][16]!="yes"){ ;
target.push(data[n]);

我最终想写一些重复的检查和功能,但想要解决它的问题。

肉:

function test() {
  var source = SpreadsheetApp.openById("0A....nc");
  var sh = source.getSheetByName("NA");
  var data=sh.getDataRange().getValues()

  var target=new Array();
  for(i=0;i<data.length;++i){ 
  for (j=0;j<data[i].length;++j){
    if (data[i][13]=="yes"&&data[i][16]==""){ ;
      target.push(data[i]);
}
}
if(target.length>0){
  var ss = SpreadsheetApp.openById("0A....Gc");   
  var sh2=SpreadsheetApp.setActiveSheet(ss.getSheetByName("Sheet5")); 
  var xx = sh2.getLastRow();
  sh2.getRange(xx+1,1,target.length,target[0].length).setValues(target);
  }
}
}

感谢任何人提供的任何帮助!

编辑:设法让我的工作完全像我想要的那样。

function testtest() {
  var source = SpreadsheetApp.openById("0A....Wc");
  var sh = source.getSheetByName("Sheet1");
  var data = sh.getDataRange().getValues()
  var ss = SpreadsheetApp.openById("0A....mc");   
  var sh2 = ss.getSheetByName("Sheet1"); 
  var xx = sh2.getLastRow();


  var target=new Array();
  for(i=0;i<data.length;++i){ 
    if (((data[i][13]=='yes')||(data[i][13]=='YES')||(data[i][13]=='Yes')) && !((data[i][16]=='yes')||(data[i][16]=='YES')||(data[i][16]=='Yes'))){
      target.push(data[i]);}

}

   var newData=new Array();
   for(i in target){
    var sh2D = sh2.getDataRange().getValues();
    var row = target[i];
    var duplicate = false;
    for(j in sh2D){
      if(row.join() == sh2D[j].join()){
        duplicate = true;
      }
     }
     if(!duplicate){
       newData.push(row);
    }
  }

   if(newData.length>0){ 

   var dest = sh2.getRange(xx+1,1,newData.length,newData[0].length);
      dest.setValues(newData);
   }
}

是的,它很草率。 现在正致力于更新新目标表中的单元格并将该更改转换为主列表。实际上,它只是在工作完成时向列添加“是”,然后更新主页(在一张经常被25个人排序的工作表上)。

哦,如果有人知道一种独立于案例或额外空格搜索“是”的方法,它肯定有助于清理我的IF线。

1 个答案:

答案 0 :(得分:1)

  

哦,如果有人知道一种独立于案例或额外空格搜索“是”的方法,它肯定有助于清理我的IF线。

按照你说的做...比较大写值,修剪空格。

if ((data[i][13].trim().toUpperCase() === 'YES') && (data[i][16].trim().toUpperCase() != 'YES')) {
  ...

如果你需要做很多事情,请创建一个辅助函数:

/**
 * Perform case-insensitive, trimmed comparison of two strings.
 * Returns true if strings are nominally equal.
 */
function strEqual(str1, str2) {
  var one = str1.trim().toUpperCase();
  var two = str2.trim().toUpperCase();
  return one === two;
}

然后你可以这样做:

if (strEqual(data[i][13],'yes') && !strEqual(data[i][16],'YeS')) {
  ...