当“ X值”低于Y时,在var中添加更多值

时间:2019-01-28 02:12:04

标签: google-apps-script google-sheets

我需要使用3个或4个列来创建JSON数组,但是我无法使用“ while”条件填充数据。

我有一些Google表格数据,该数据可以包含3或4列,该数据必须位于JSON数组中,例如:

|---------------------|------------------|---------------------|------------------|
|      variable       |     condition    |        value        |      and/or      |
|---------------------|------------------|---------------------|------------------|
|         CPC         |        >         |         100         |                  |
|---------------------|------------------|---------------------|------------------|

在第一个示例中,第四列为空,因为我们只有一行数据,因此结果必须为: [“ CPC”,“>”,100]

如果我们有两行(或更多)数据,则应如下所示:

|---------------------|------------------|---------------------|------------------|
|      variable       |     condition    |        value        |      and/or      |
|---------------------|------------------|---------------------|------------------|
|         CPC         |        >         |         100         |       and        |
|---------------------|------------------|---------------------|------------------|
|     s_volume        |        <         |         950         |       and        |
|---------------------|------------------|---------------------|------------------|
|      s_volume       |        >         |         100         |                  |
|---------------------|------------------|---------------------|------------------|

如您所见,最后一列的最后一行为空,结果应如下所示:

[“ CPC”,“>”,100], “和”, [“ s_volume”,“ <”,950], “和”, [“ s_volume”,“>”,100]

最后,必须将此JSON数组分配给变量。

我已经尝试过:

//Get values from cells 
 var fil1 = ss.getSheetByName("app").getRange(row,4,1,1).getValue();
 var fil2 = ss.getSheetByName("app").getRange(row,5,1,1).getValue();
 var fil3 = ss.getSheetByName("app").getRange(row,6,1,1).getValue();
 var fil4 = ss.getSheetByName("app").getRange(row,7,1,1).getValue();

  //Count how many rows with data exist
  var coldat = ss.getSheetByName("app").getRange("D1:D").getValues();
  var coldats = coldat.filter(String).length;

  var jsonarr =  [fil1, fil2, fil3]
  //loop para añadir nuevos filtros
   while (row < coldats) {
   fil4,[fil1,fil2,fil3];
    row++;
  };

显然,在我的代码中,变量“ jsonarr”仅填充第一行,而忽略了下面的任意行。

我尝试了一些教程和数组方法来制作此JSON对象,但我只是无法获得正确的答案。对于这个新手问题,我真的感到很抱歉,我不是编码专家,只是做一些工作并且正在学习基础知识的怪胎。

1 个答案:

答案 0 :(得分:0)

提供此答案是为了帮助OP汇总OP原始代码中标识的一系列问题。我在答案代码中留下了许多Logger语句,OP可以使用这些语句来识别代码不同阶段的值,帮助进行故障排除并有助于技能发展。

代码的结果包含在变量fildata中。根据样本数据,值是:
["CPC",">",100],"and",["s_volume","<",950],"and",["s_volume",">",100]
如何导出此操作取决于OP。

OP试图为电子表格中的数据创建数据数组(非兼容JSON),作为到另一个系统的输入。

OP代码的设计意味着它仅检索一行数据,并且永远无法按预期建立阵列。 OP的代码是答案的基础,但有几个主要更改:

  1. coldatcoldats移动到代码顶部,以便可以使用coldats定义数据范围。
  2. 检索单个数据范围(getRange(2, 4, coldats, 4)),并且仅使用一次“ getValues()”。
  3. 创建了一个变量来保存代码结果
  4. 逐行浏览数据
  5. 对于每一行,评估G列(“和/或”列)是否包含值。根据结果​​,在该行的结果中包括G列。
  6. 按行逐行递增结果。

function so54394711() {

  // setup spreadsheet
  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getSheetByName("app");

  //Count how many rows with data exist
  var coldat = sheet.getRange("D2:D").getValues();
  var coldats = coldat.filter(String).length;
  //Logger.log("DEBUG: Number of rows of data = "+coldats); //DEBUG

  // establish the data range and values
  var range = sheet.getRange(2, 4, coldats, 4);
  //Logger.log("DEBUG: range = "+range.getA1Notation());//DEBUG
  var values = range.getValues();
  //Logger.log("DEBUG: values: "+ values);//DEBUG

  // create a variable to hold the results
  var fildata = "";

  //loop through the data by row, build the results line-by-line
  for (i = 0; i < coldats; i++) {
    var filD = values[i][0];
    var filE = values[i][1];
    var filF = values[i][2];
    var filG = values[i][3];

    // test if column G contains a value
    if (filG.length == 0) {
      // array is empty
      fildata += '[' + '"' + filD + '","' + filE + '",' + filF + ']';
      //Logger.log("DEBUG: G=MT, fildata = "+fildata);//DEBUG
    } else {
      //array not empty
      fildata += '[' + '"' + filD + '","' + filE + '",' + filF + ']' + ',"' + filG + '",';
      //Logger.log("DEBUG: G<>MT, fildata = "+fildata);//DEBUG
    }
    // Logger.log("DEBUG: fildata = "+fildata);//DEBUG   
  }
}