首页 > 解决方案 > 如何在 Google Apps 脚本中将数组项加入到每行的单个字符串中?

问题描述

我想在 Google 表格中设想以下内容,我可以在其中运行一个脚本来检查 A 列与三个列表的对比,G 列中的输出将说明 A 列中出现的值的列表:

理想结果

我已经能够通过一组非常低效的嵌套循环 setValue() 和 getValue() 来产生这种效果。

但是,我知道有更优化的方法来处理它,例如通过数组附加项目。

我对 Google Apps 脚本数组的语法不是很熟悉,所以我想知道如何去做。到目前为止,我已经写了以下内容:

function list_function()
{
  var sheet = SpreadsheetApp.getActiveSheet();
  var check_list = sheet.getRange("A1:A").getValues();
  var list_A = sheet.getRange("C1:C").getValues();
  var list_B = sheet.getRange("D1:D").getValues();
  var list_C = sheet.getRange("E1:E").getValues();
  
  var checking_array = [];
  
  for(var i=1; i<check_list.length; i++)

  {

//list A here
for (var j = 1; j < list_A.length; j++)
{
  if (check_list[i][0] != "" && check_list[i][0].toUpperCase() == list_B[j][0].toUpperCase())
  {
  
    checking_array.push(['List_A"']);
  }
}

//List B here
   for (var k = 1; k < list_B.length; k++)
{
  if (check_list[i][0] != "" && check_list[i][0].toUpperCase() == list_B[k][0].toUpperCase())
  {
    checking_array.push(['List_B"']);
  }
}

  //List C here
   for (var l = 1; l < list_C.length; l++)
{
  if (check_list[i][0] != "" && check_list[i][0].toUpperCase() == list_C[l][0].toUpperCase())
  {
    checking_array.push(['List_C"']);
  }
}
//Problem here, not sure how to join() array items into single string value for cell and match according to list 
//ideally matches the above picture
    sheet.getRange(1, 7, check_list.length).setValues(checking_array);
  }
}

标签: arraysgoogle-apps-scriptgoogle-sheets

解决方案


您可以一次获取整个电子表格的值,并获取值或设置值:

function list_function()
{
  var sheet = SpreadsheetApp.getActiveSheet();
  var lastRow = sheet.getLastRow();
  var lastColumn = sheet.getLastColumn();
  var data = sheet.getRange(1, 1, lastRow, lastColumn).getValues(); //getRange(starting Row, starting column, number of rows, number of columns)
  
 
  var check = "";

  var dataValue;
  var checkValue;
     
//All lists here
    for (var i = 1; i < lastRow; i++)  { 
           checkValue =  data[i][0];
           for (var j = 2; j < lastColumn - 2; j++)
           {
             for (var k=1 ; k< lastRow;  k++){
               dataValue =  data[k][j];
               if (dataValue.toUpperCase() === checkValue.toUpperCase() )
                {
                   check=check + "," + data[0][j];
                }
             }
             
           } 
           data[i][lastColumn-1]=check.slice(1);
           check = "";
     } 
    
    
   check = "x"; // set breakpoint here to check data[][] values before write
   sheet.getRange(1, 1, lastRow, lastColumn).setValues(data);
  
}

推荐阅读