我试图在我的工作表中循环一列,并根据活动单元格的值和颜色设置相邻单元格的值。这是我尝试过但我似乎无法工作......
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;
}
答案 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");
}
}