Google Apps脚本条件循环

时间:2013-08-24 13:05:09

标签: google-apps-script

我试图在我的工作表中循环一列,并根据活动单元格的值和颜色设置相邻单元格的值。这是我尝试过但我似乎无法工作......

function setValue(){
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var end = SpreadsheetApp.getActiveSheet().getLastRow();

  for( var i = 1; i < end + 1; ++i){
    var value = sheet.getRange(i, 4).getValue();
    var color = sheet.getRange(i, 4).getColor();
    if (value == "Authenticated" && color == "#ffffff") {
      sheet.getRange(i, 5).setValue("True");
      }
     else {
       sheet.getRange(i, 5).setValue("False");
       }
  }
}

更新:

谢谢!我有一个非常大的数据集,所以这个功能超时。我当时想把它变成一个单元格。我试过这个,但我似乎无法获得inputValue单元格背景颜色的颜色......

function setKeep(inValue){
  var sheet = SpreadsheetApp.getActiveSheet();
  var cell = sheet.getActiveCell();
  var color = cell.getBackgroundColor();
  var outValue = "";

  if (inValue == "AUTHENTICATED" && color == "white"){
    outValue = "TRUE";
    }
  else{
    outValue = "FALSE";
    }
  return outValue;

}

3 个答案:

答案 0 :(得分:1)

查看代码,我认为您没有使用脚本编辑器或编辑器中提供的提示。那是因为你使用的一些方法不存在。

function setValue(){
  var sheet = SpreadsheetApp.getActiveSheet(); // You want the sheet not the spreadsheet.
  var end = SpreadsheetApp.getActiveSheet().getLastRow();

  for( var i = 1; i < end + 1; ++i){
    var value = sheet.getRange(i, 4).getValue();
    var color = sheet.getRange(i, 4).getFontColor(); // There is no Range.getColor()
    Logger.log(color); // Print out the color to see what you're getting. I was getting a 'general-black' as the color
    if (value == "Authenticated" && color == "#ffffff") {
      sheet.getRange(i, 5).setValue("True");
    }
    else {
      sheet.getRange(i, 5).setValue("False");
    }
  }
}

答案 1 :(得分:1)

不确定为什么选择这个“一步一步”的解决方案,你可以通过很少的修改使初始脚本更有效率。

我敢肯定,如果你提到你有很多数据,那么Srik会建议另一个版本的代码。

基于GAS中的this article about best practices,这是一个快速版本的脚本,不应该超时。

对于信息,在包含1000行的工作表上,我得到了这个结果:

Execution succeeded [0.282 seconds total runtime]

试一试......; - )

function setValue(){
  var sheet = SpreadsheetApp.getActiveSheet(); 
  var end = SpreadsheetApp.getActiveSheet().getLastRow();
  var range = sheet.getRange(1,4,end,2);// get both columns you need
  var colors = range.getFontColors();// batch read colors in range
  var values = range.getValues();// batch read values in range
  for( var i = 0; i < values.length; ++i){ // loop in the array instead of sheet, it's really faster
    Logger.log(colors[i][0]); 
    if (values[i][0] == "Authenticated" && colors[i][0] == "#ffffff") { // compare the array values
      values[i][1]='True';// and write result in the array as well
    }
    else {
      values[i][1]='False';// and write result in the array as well
    }
  }
  range.setValues(values);// batch write back the results in sheet 
}

答案 2 :(得分:0)

你也可以用一行代替if语句:

function setValue(){
  var sheet = SpreadsheetApp.getActiveSheet(); 
  var end = sheet.getLastRow() + 1;             // reuse existing sheet

  for( var i = 1; i < end; i++) {               // traditional for loop iterates with i++
    var value = sheet.getRange(i, 4).getValue();
    var color = sheet.getRange(i, 4).getFontColor();
    // The ('value == ...') returns true or false
    sheet.getRange(i, 5).setValue(value == "Authenticated" && color == "#ffffff");
  }
}