【问题标题】:Google Script - stuck in a search and write loop, without searching entire docGoogle Script - 陷入搜索和编写循环,没有搜索整个文档
【发布时间】:2012-10-18 16:53:52
【问题描述】:

我正在尝试创建一个在 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 行。

【问题讨论】:

  • 作为仅供参考,Stack Overflow 旨在解决清晰的问题/回答技术问题。对于展示和讲述或广泛的建议,您可能会在 Apps Script Google+ 社区中获得更大的成功。有关更多信息,请参阅我们的支持页面:developers.google.com/apps-script/support
  • 你知道循环卡在哪里了吗?要比较 YES 大小写无关,只需添加 toUpperCase。例如:data[i][13].toUpperCase() == "YES"

标签: google-apps-script


【解决方案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')) {
  ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    相关资源
    最近更新 更多