值增加时将单元格复制到另一个工作表

时间:2017-06-28 10:56:25

标签: google-apps-script google-sheets

昨天我问了这个问题:Send email notification when values in different columns increase 基本上,我有一个百分比计算数组,如果最后一行不同列中的值发生变化并符合增加标准,则应将它们复制到另一个工作表上。

我尝试相应地更改代码:

function compareValue() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Perc");
  var data = sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).getValues();
  var list = []; 

  for(var i=0; i<data[0].length; i++){

    var title = data[0][i]; 
    var value = parseFloat(data[data.length -1][i]); /

    if(value >= 2){     
      var element = [title, value];    
      list.push(element)                
    }    
  }

  if(list.length >= 1){ 
    setValues(list);
  }
}


function setValues(list) {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Alert");
  sheet.getRange('A1:Z50').clearContent();
  var title = sheet.getRange(1, 1, list.length);
  var value = sheet.getRange(1, 2, list.length);

  for(var i=0; i<list.length;i++){
    title.setValue(list[i][0]);
    value.setValue(list[i][1]);
  }

}

现在问题是当我只有一个单元格改变了一切都很好,但是当有多个单元格时,脚本只复制一个值,并且重复该值应该是多少个值。例如,如果4个单元格增加超过值2,则只复制一个值并重复4次。我究竟做错了什么?谢谢

1 个答案:

答案 0 :(得分:1)

问题出在你的价值集上。在您的代码中,您使用列表中的最后一个值设置所有范围的值,因为它是for循环中的最后一个值。考虑使用易于使用的range.setValues()

function compareValue() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Perc");
  var data = sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).getValues();
  var list = []; 

  for(var i=0; i<data[0].length; i++){

    var title = data[0][i]; 
    var value = parseFloat(data[data.length -1][i]);

    if(value >= 2){     
      var element = [title, value];    
      list.push(element)                
    }    
  }

  if(list.length >= 1){ 
    setValues(list);
  }
}


function setValues(list) {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Alert");
  sheet.getRange('A1:Z50').clearContent();
  var range = sheet.getRange(1, 1, list.length, list[0].length);

  range.setValues(list);

}