【问题标题】:Combine multy arrays side by side google script并排组合多个数组谷歌脚本
【发布时间】:2017-02-21 12:17:54
【问题描述】:

我在 Google 脚本中有此代码,用于根据 Sheet3 的 Sheet2 中的条件从 Sheet1 获取数组。但现在阵列只放置在另一个之下。我需要的是将“v”中的每个新数组放在接下来的 5 列中,例如我的电子表格中的示例。

其次 - 在此之前,我使用了带有搜索公式的过滤器,它允许我使用 * 或 ? 等通配符。如何在我的新函数中使用通配符或正则表达式?

如果有任何帮助,我将不胜感激。

    function getval(){

      var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
      var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");
      var sspodbor = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet3");

      var range = ss.getRange("A2:A29");
      var values = range.getValues();

      var rangez = sheet.getRange("A1:A14");
      var valuesz = rangez.getValues();

      var z = []
      for (var x = 0; x<valuesz.length; x++){
        z.push(valuesz[x])
      }

      var v = [];
      for (var q = 0; q < valuesz.length; q++){
        for (var s = 0; s < values.length; s++){
          if(values[s][5] ==  z[q]){
            v.push([values[s][0],values[s][1],values[s][2],values[s][3],values[s][4]]);
          }
//I am guessing that here must be a separating function       
        }
      }
      var range = sspodbor.getRange(4, 1, v.length,v[0].length);
      range.setValues(v);
    }

我的电子表格:https://docs.google.com/spreadsheets/d/1o7ErbeFHA7yyxMC0HMn3Uj5ZBRcy2uAwa1UpolVpBFI/edit?usp=sharing

【问题讨论】:

  • 一些小事:首​​先 var range = ss.getRange("A2:A29");可能应该是 var range = ss.getRange("A2:F29");其次 var z = [] 应该是 var z = [];但对我来说最大的问题是你如何对它们进行分组。 Sheet2 只有 14 个值。所以只有 14 个 q 值,但您在示例中显示了 16 列。那么,您如何将它们分组,
  • 你好,@Cooper!如您所见,我从您之前的回答中学到了一些关于数组的知识!我以非常简单的方式对它们进行分组:在使用 q var 的循环中,我从 rangez 中取出一个单元格,然后在使用 s var 的循环中检查值范围中的某个值是否等于它,然后将其推送到 v 数组。当我取下一个 q var 时,我需要再次将相等的值从 0-4 推送到下一列
  • 我最终在这里包含了 q 值: if(values1[s][5] == z[q]){ v.push([values1[s][0],values1[s ][1],values1[s][2],values1[s][3],values1[s][4],q]);} 以及您的输出数据,因为它似乎对每个组都是通用的。

标签: arrays regex google-apps-script wildcard


【解决方案1】:

横向展开组

这不是您见过的最漂亮的解决方案,希望其他人会仔细检查并做出改进,但它就是这样。

function getval()
{
  var Sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  var Sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");
  var output = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("output");
  var knew = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('knew');
  var knewrange = knew.getRange(1,1,10,100);
  var pipe = '';

  var range1 = Sheet1.getRange("A2:F29");
  var values1 = range1.getValues();

  var range2 = Sheet2.getRange("A1:A14");
  var values2 = range2.getValues();

  var z = [];  
  for (var x = 0; x<values2.length; x++)
  {
    z.push(values2[x])
  }
  var v = [];
  for (var q = 0; q < values2.length; q++)
  {
    for (var s = 0; s < values1.length; s++)
    {
      if(values1[s][5] ==  z[q])
      {
        v.push([values1[s][0],values1[s][1],values1[s][2],values1[s][3],values1[s][4],q]);
      }
    }
  }
  var vlength=v.length;  
  var range3 = output.getRange(1, 1, v.length,6);
  range3.setValues(v);

  var w = [];
  var voff = 0;
  var hoff = 0;
  for(var m=0;m<10;m++)
  {
    w[m]=[];
    for(var n=0;n<100;n++)
    {
      w[m][n]='' ;
    }
  }
  var color = ['yellow','orange'];
  for(var i=0;i<v.length;i++)
  {
    for(var j=0;j<5;j++)
    {

      if(i-voff==0){knew.getRange((i-voff + 1),(j + hoff + 1),4,5).setBackground(color[v[i][5] % 2])};
      if((i-voff)==0 || v[i][5] == v[i-1][5])
      {
        w[i - voff][j + hoff]=v[i][j];
      }  
      else
      {
        voff = i;
        hoff += 5;
        w[i - voff][j + hoff]=v[i][j];
      }
    }
  }
  knewrange.setValues(w);
}

我从您的电子表格和原始 getval 函数中复制了数据。我最终更改了一些名称,以便找出更容易找到数据的位置。这对我来说是一个难题,也是我喜欢的一个。 谢谢

【讨论】:

  • 嘿,@Cooper!看看你的答案——它工作得很好,它有很多我必须理解的新功能和运算符。在查看您的答案时,我意识到在“q”循环中移动 SetValue、向其中添加另一个数组并设置列号 1 而不是 (q+1)*5 就足够了。很简单,谢谢!
  • 是的,将 q 添加到数据集中可以在循环中访问,因此当 q[i] !==q[i=1] 时,我选择创建一个组转换w 数组并初始化为大于我需要的尺寸,这样我就可以避免一直出现尺寸错误。但是,您需要小心,因为更新循环内的大数组会消耗大量资源,尽管这样刷新屏幕确实有助于弄清楚发生了什么。您可能可以将 w 5 * 组数乘以最大组大小。
猜你喜欢
  • 2020-07-12
  • 2015-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
  • 2013-05-06
相关资源
最近更新 更多