Javascript 在列中查找颜色并从另一列获取数据

Javascript 在列中查找颜色并从另一列获取数据,javascript,google-apps-script,Javascript,Google Apps Script,我有一个如下的电子表格 A B C 7- Test [red] 8- Test1 [yellow] 9- Test2 [red] 所以,我试图在C列中传递一个循环,从C7开始。当它得到红色时,我应该能够从A列中得到值,即Test和Text2 这是相关代码(它不是在if上输入的) SpreadsheetApp

我有一个如下的电子表格

      A             B             C
7- Test                       [red]
8- Test1                      [yellow]
9- Test2                      [red] 
所以,我试图在C列中传递一个循环,从C7开始。当它得到红色时,我应该能够从A列中得到值,即Test和Text2

这是相关代码(它不是在if上输入的)

SpreadsheetApp.getUi()
var s=SpreadsheetApp.getActiveSheet();
var dataCor=s.getRange('C7:C').getBackgrounds();
msgBox(dataCor)//这里我显示了颜色的代码。
var dataValor=s.getRange('A7:A').getValues();
msgBox(dataValor)//这里我显示了A列中的值。
var列表=[];
var n=0;
var n2=0;
对于(变量i=0;i
如果你们有什么建议,请告诉我


PS1:就我所知,有没有函数会忽略数学中的周末?例如,如果我得到2月22日的日期,我知道20和21应该被忽略,这样人们就可以从15岁工作到19岁。无论如何,它与主题无关。

getValues()
语句中获得的数组是2D数组,换句话说,数组的数组

在您的日志中,您应该看到这样的内容:
[[xx]、[yy]、[zz]、…]

因此,您的比较应该在所需索引处比较数组的内容,而不是像您那样比较整个2D数组

在脚本中替换

if(dataCor == '#cc0000')

if(dataCor[n][0]='#cc0000')

同样,将结果添加到输出列表时:

list[n2] = dataValue[n]
我将使用

最后,当你得到你的列表数组时,用一个简单的步骤把它写到你的工作表列中

s.getRange(1,1,list.length,list[0].length).setValues(list)

编辑 遵循iJay的答案,即在循环中使用电子表格服务调用(这是一个坏主意,因为它非常慢-请参阅)

这里是他的代码修改,以提高效率

function getValueByColor(){
   var s = SpreadsheetApp.getActiveSheet();
   var myRangeValues = s.getRange('A7:C').getValues();
   var myRangeColors = s.getRange('A7:C').getBackgrounds();
   Logger.log(myRangeColors)
   var list = [];
   for (var i = 0; i < myRangeValues.length; i++) {
      if(myRangeColors[i][2] == '#cc0000'){ // idx 2 is 3rd column = C
       list.push([myRangeValues[i][0]]) // grab value in column A
     }
   }
   Browser.msgBox(list);
 }
注意:由于Browser.msgBox不处理“新行”,我建议使用HTML以您想要的方式显示它

代码:

   ...   
   var list = '';
   for (var i = 0; i < myRangeValues.length; i++) {
      if(myRangeColors[i][2] !== '#cc0000'){ // idx 2 is 3rd column = C
       list+=myRangeValues[i][0]+' | '+myRangeValues[i][1] +'<br>' // grab value in column A and B
     }
   }
  var result= HtmlService.createHtmlOutput(list)
   SpreadsheetApp.getUi().showModalDialog(result, 'result')
 }
。。。
var列表=“”;
对于(var i=0;i'//获取A列和B列中的值
}
}
var result=HtmlService.createHtmlOutput(列表)
SpreadsheetApp.getUi().showModalDialog(结果'result')
}

getValues()
语句中获得的数组是2D数组,换句话说,数组的数组

在您的日志中,您应该看到这样的内容:
[[xx]、[yy]、[zz]、…]

因此,您的比较应该在所需索引处比较数组的内容,而不是像您那样比较整个2D数组

在脚本中替换

if(dataCor == '#cc0000')

if(dataCor[n][0]='#cc0000')

同样,将结果添加到输出列表时:

list[n2] = dataValue[n]
我将使用

最后,当你得到你的列表数组时,用一个简单的步骤把它写到你的工作表列中

s.getRange(1,1,list.length,list[0].length).setValues(list)

编辑 遵循iJay的答案,即在循环中使用电子表格服务调用(这是一个坏主意,因为它非常慢-请参阅)

这里是他的代码修改,以提高效率

function getValueByColor(){
   var s = SpreadsheetApp.getActiveSheet();
   var myRangeValues = s.getRange('A7:C').getValues();
   var myRangeColors = s.getRange('A7:C').getBackgrounds();
   Logger.log(myRangeColors)
   var list = [];
   for (var i = 0; i < myRangeValues.length; i++) {
      if(myRangeColors[i][2] == '#cc0000'){ // idx 2 is 3rd column = C
       list.push([myRangeValues[i][0]]) // grab value in column A
     }
   }
   Browser.msgBox(list);
 }
注意:由于Browser.msgBox不处理“新行”,我建议使用HTML以您想要的方式显示它

代码:

   ...   
   var list = '';
   for (var i = 0; i < myRangeValues.length; i++) {
      if(myRangeColors[i][2] !== '#cc0000'){ // idx 2 is 3rd column = C
       list+=myRangeValues[i][0]+' | '+myRangeValues[i][1] +'<br>' // grab value in column A and B
     }
   }
  var result= HtmlService.createHtmlOutput(list)
   SpreadsheetApp.getUi().showModalDialog(result, 'result')
 }
。。。
var列表=“”;
对于(var i=0;i'//获取A列和B列中的值
}
}
var result=HtmlService.createHtmlOutput(列表)
SpreadsheetApp.getUi().showModalDialog(结果'result')
}

我同意@serge insas

我们可以使用相同的范围,而不是使用两个数组作为背景和值。只是一个想法

function getValueByColor()
{
var s = SpreadsheetApp.getActiveSheet();
var myRange = s.getRange('A7:C');
var list = [];

for (var i = 1; i <= myRange.getNumRows(); i++) 
{
  // 3 -column c : 
  if(myRange.getCell(i,3).getBackground() == '#cc0000')
  {
    //1- column A
    list.push(myRange.getCell(i,1).getValue())
  }
}
//debugger;
Browser.msgBox(list);
}
函数getValueByColor() { var s=SpreadsheetApp.getActiveSheet(); var myRange=s.getRange('A7:C'); var列表=[];
对于(var i=1;i我同意@serge insas

我们可以使用相同的范围,而不是使用两个数组作为背景和值

function getValueByColor()
{
var s = SpreadsheetApp.getActiveSheet();
var myRange = s.getRange('A7:C');
var list = [];

for (var i = 1; i <= myRange.getNumRows(); i++) 
{
  // 3 -column c : 
  if(myRange.getCell(i,3).getBackground() == '#cc0000')
  {
    //1- column A
    list.push(myRange.getCell(i,1).getValue())
  }
}
//debugger;
Browser.msgBox(list);
}
函数getValueByColor() { var s=SpreadsheetApp.getActiveSheet(); var myRange=s.getRange('A7:C'); var列表=[];
对于(var i=1;我知道了。它非常快,ty。但是如果我必须在msgbox中显示多个值呢?例如,第二个列表称为list2。因此,在messagebox中,我会有类似于:Browser.msgbox(list,list2)的内容;并且,对于自定义它,如果它以一行分隔就好了。例如,list1Element,list2Element,然后它跳过该行以显示list1Element2,list2Element2。我不确定是否已清除,但就是这样。PS:我已经存储了list2。我尝试使用:SpreadsheetApp.getActiveSpreadsheet().toast(list1,list2,0);但它首先显示列表1中的元素,然后显示列表2中的元素。因此,我尝试了SpreadsheetApp.getActiveSpreadsheet().toast(列表1,列表2,0);但是,正如预期的那样,结果是相同的。因此,我需要显示类似于:Xlist1、Xlist2、Ylist1、Ylist2的内容。但是,每次我从列表2中显示为元素时,我也应该能够跳过该行。另一个选项是只在一个列表中存储两个列表。但我无法显示两个元素,然后跳过该行。我将显示模式更改为HTML。我知道你已经在一个2列列表中有了数据,只需在for循环中逐项添加数据,然后使用
创建CR。你可以使用HTML表或任何你喜欢的东西使其看起来更好。对不起,我为“chariot return”写了CR,换句话说,“new line”(即使它不完全相同……这是一种滥用的简化;-)明白了,很快,泰