【问题标题】:Break if value from range on sheet1 is found in range on sheet2 not working如果在 sheet2 的范围内发现 sheet1 范围内的值不起作用
【发布时间】:2020-04-26 01:01:29
【问题描述】:

基本上,用户将在工作表 NovoItem 上输入新项目的数据。当按下保存按钮(待添加)时,代码应该在 sheet2 (ArquivoItens) 上检查项目是否已经存在。如果是这样,那么它应该打破。 如果在 sheet2 (ArquivoItens) 上找到值,则代码不会中断:

function copyrange() { 
  var sourceSheet = 'Novo Item';
  var destinationSheet = 'ArquivoItens';
  var ss = SpreadsheetApp.getActiveSpreadsheet(); 
  var sheet = ss.getSheetByName(sourceSheet);
  var ActiveUser = Session.getActiveUser();

  //it add current user and a timestamp to the last 2 columns on sheet1.
  var val = sheet.getRange("Q12:Q")
      .getValues();
  for (var i = 0; i < val.length; i++) {
      if (val[i] > 0) {
        sheet.getRange(12, 34, i + 1, 1)
               .setValue(new Date());
       sheet.getRange(12, 35, i + 1, 1)
               .setValue(ActiveUser)
      }
    }

  var LastRowSource = sheet.getLastRow();
  var LastColumnSource = sheet.getLastColumn();
  var values = sheet.getRange(11,1,LastRowSource,LastColumnSource).getValues();
  var csh = ss.getSheetByName(destinationSheet);
  var data = []; 

  for (var i = 1; i < values.length; i++) {    
    if ( values[i][0] != '') { 
      data.push(values[i]);      
      //sheet.deleteRow(i+1) 
    } 
  }

  var dataNovoItem = sheet.getRange("B12:B").getValues(); // gets data (item number) in the sheet where data is input
  var dataArquivoItens = csh.getRange("B2:B").getValues(); //gets the item number on the datawarehouse sheet 

  for(var n=1; n < dataNovoItem.length ; n++){
    for(var j=1; j< dataArquivoItens.length ; j++){
      if (dataNovoItem[n] != 0 && dataArquivoItens[j] != 0) {
        if(dataNovoItem[n] == dataArquivoItens[j]) {
        break;
        }
      }
  }
    }

  Logger.log("Novo Item" + dataNovoItem);
  Logger.log("ArquivoItens" + dataArquivoItens);

  //Copy data array to destination sheet  
 csh.getRange(csh.getLastRow()+1,1,data.length,data[0].length).setValues(data);

}

这是我得到的日志:

感谢任何帮助。

【问题讨论】:

标签: javascript google-sheets spreadsheet


【解决方案1】:

您没有使用迭代器来访问您正在迭代的索引。

应该是

  for(var n=1; n < dataNovoItem.length ; n++){
    for(var j=1; j< dataArquivoItens.length ; j++){
      if (dataNovoItem[n] != 0 && dataArquivoItens[j] != 0) { // this is where I try to eliminate blank rows in both ranges. I've tried != '', but it gets me the same result on the print below.
        if(dataNovoItem[n] == dataArquivoItens[j]) {
        break; //not working
        }
      }
  }
}
  Logger.log("Novo Item" + dataNovoItem);
  Logger.log("ArquivoItens" + dataArquivoItens);

【讨论】:

  • 你好,@Joel Hager,刚刚添加了它们,它给了我相同的结果。 ://
  • 没有其他代码,我们无法评估问题出在哪里。
【解决方案2】:

我最终通过仅遍历现有列表并将每一行与我在当前工作表上设置的值进行比较来解决这个问题。这对你的程序员来说可能太合乎逻辑了,但对于像我这样的初学者来说,这可能会很痛苦。

这就是现在的工作方式:

var newItemID = sheet.getRange("W5").getValue(); //get the destination cell, where the item will be set
  var itemIDArquivoItens = csh.getRange(2, 1, csh.getLastRow(),1).getValues(); //gets the data range where the existing ID's to be compared against are

  var message = "Item já cadastrado!"; //Message to be displayed in case the ID already exists in the list;
  for(j = 1; j < itemIDArquivoItens.length; j++) { //loops through existing ID
    if(itemIDArquivoItens[j][0] == newItemID) { //if the ID already exists, pop up a message and stop the code from running
      Browser.msgBox(message)
      return;
    }
  }

【讨论】:

  • 将您的答案标记为已接受,以便更多人从中受益。
猜你喜欢
  • 1970-01-01
  • 2020-10-04
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多