0

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

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;

}
4

3 回答 3

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");
    }
  }
}
于 2013-08-24T14:04:05.650 回答
1

不知道为什么选择这个“逐步”解决方案,您可以通过很少的修改使初始脚本更加高效。

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

基于这篇关于GAS 最佳实践的文章,这里有一个快速版本的脚本,它不应该超时。

有关信息,在一张有 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 
}
于 2013-08-24T21:41:12.107 回答
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");
  }
}
于 2014-05-30T23:41:20.063 回答