【问题标题】:Google Script: Multiple conditions per unique IDGoogle Script:每个唯一 ID 有多个条件
【发布时间】:2021-08-01 08:40:31
【问题描述】:

脚本将计算所有 VIN 号码重复的次数以及是否所有部件都已到达该 VIN 号码(汽车)。

例如,如果 VIN 号重复 5 次,则意味着有 五个零件将到达,那么下一步将是 如果有 5 个“是”值,请检查到达的列是否有此类 VIN

(重复的 VIN 号)5/5(“是”值的数量)

将触发它将 [Master] 选项卡的 Parts Order 列更改为 "Yes" 以用于该特定 VIN 号

用户将手动更新 [Parts] 选项卡,到达列时使用 “是”留空。 (如果为空白,则零件尚未到达。)

查看谷歌表格模板的链接: https://docs.google.com/spreadsheets/d/1wlGV_QCWpRwmI5FWiOli6lXuzRATy_Goygp3lhtm-Ek/edit?usp=sharing

我的尝试:

获取列最后一个值的特殊函数:

function getLastRowSpecial(range){
  var rowNum = 0;
  var blank = false;
  for(var row = 0; row < range.length; row++){
    if(range[row][0] === "" && !blank){
      rowNum = row;
      blank = true;

    }else if(range[row][0] !== ""){
      blank = false;
    };
  };
  return rowNum;
};

在这里,我能够计算每个 VIN 编号出现的次数,但我无法计算每个唯一 VIN 编号的“是”值的数量。这需要是动态的。我最后的方法不是动态的。特别是关于 var number

主脚本:

      /** ---------------------- SPREAD SHEETS ---------------------- **/
      var masterS = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Master");
      var partS = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Parts");
      /** ----------------- Selecting Range of Cells ----------------- **/
      /** ----- Parts Spread Sheet ----- **/
      /** VIN to Match */
      var vinPartOrderRangeP = partS.getRange("C5:C");
      var vinPartValuesP = vinPartOrderRangeP.getValues();
      var columnCheckPartVINP = getLastRowSpecial(vinPartValuesP);
      var partVINDataRangeP = partS.getRange(5, 3, columnCheckPartVINP, 1);
      var partsVinSetP = partVINDataRangeP.getValues();
    
      /** Part Arrived */
      var partOrderedRangeP = partS.getRange("N5:N");
      var partOrderedValuesP = partOrderedRangeP.getValues();
      var partOrderedValuesCorrectLengthP = partOrderedValuesP.splice(0,partsVinSetP.length);
    
      /** Combining VINs with Parts Arrived */
      var vinPartsArrivedP = [];
      vinPartsArrivedP.push(partsVinSetP,partOrderedValuesCorrectLengthP);
    
      /** ----- Master Spread Sheet ----- **/
      /** VIN to Match */
      var vinPartOrderRangeM = masterS.getRange("B5:B");
      var vinPartValuesM = vinPartOrderRangeM.getValues();
      var columnCheckPartVINM = getLastRowSpecial(vinPartValuesM);
      var partVINDataRangeM = masterS.getRange(5, 2, columnCheckPartVINM, 1);
      var partsVinSetM = partVINDataRangeM.getValues();
    
      /** Part Arrived */
      var partPastRangeM = masterS.getRange("I5:I");
      var partPastValuesM = partPastRangeM.getValues();
    
      /** ---- For-Loop getting Number of Parts that need to Arrive ---- **/
      var vinNumber = [], arrivalPartsRequired = [], prev;
    
      for (var i = 0; i < vinPartsArrivedP[0].length; i++) {
        if (vinPartsArrivedP[0][i][0] !== prev) {
          vinNumber.push(vinPartsArrivedP[0][i][0]);
          arrivalPartsRequired.push(1);
        } else {
          arrivalPartsRequired[arrivalPartsRequired.length - 1]++;
        }
        prev = vinPartsArrivedP[0][i][0];
      }
      console.log('[' + vinNumber[0] + ']','[' + arrivalPartsRequired[0] + ']')
    
      /** 
       * Now we can say arrivalPartsRequired has the number of Yes's we need 
       * per each VIN number.
      **/
    
      console.log(vinPartsArrivedP[0][3][0])
      var number = 0;
      var number2 = 0;
      var number3 = 0;
      var number4 = 0;
      var number5 = 0;
    
      for (var j = 0; j < partsVinSetM.length; j++) {
        
      };
      
      for (var k=0; k<vinPartsArrivedP[0].length; k++){
        if(vinNumber[0] == vinPartsArrivedP[0][k][0]){
          number++
          for (var i=0; i<partOrderedValuesP[0].length; i++){
            for (var j = 0; j < partOrderedValuesP[0].length; j++) {     
              if (partOrderedValuesP[i][j] == 'Yes') {
                console.log(i);
                return i+1;
              }
            }
            return -1;
          }
        }
        if(vinNumber[1] == vinPartsArrivedP[0][k][0]){
          number2++
        }
        if(vinNumber[2] == vinPartsArrivedP[0][k][0]){
          number3++
        }
        if(vinNumber[3] == vinPartsArrivedP[0][k][0]){
          number4++
        }
        if(vinNumber[4] == vinPartsArrivedP[0][k][0]){
          number5++
        }
      };
    
      console.log(number);
      console.log(number2);
      console.log(number3);
      console.log(number4);
      console.log(number5);

【问题讨论】:

  • 很遗憾,我无法从您的问题中了解您当前的问题和目标。我为我糟糕的英语水平道歉。而且,您的示例电子表格是输入情况吗?如果是这样,您能否提供您期望的示例输出情况?
  • 是的,没问题。结果将是如果汽车的所有零件都到货,然后将主列表、零件订单列更改为是,否则什么都不会改变。见链接:docs.google.com/spreadsheets/d/…
  • 感谢您添加更多信息。从您的示例电子表格中,我理解您的目标如下。您想从“零件”表中的“C”和“N”列中检索值,并想检查“C”列中的VIN # 的数量和列中yes 的数量是否相同“N”,当两个数字相同时,要将yes 放在“Master”表的“I”列的VIN # 的同一行。我的理解正确吗?
  • 没问题,是的,这是正确的。谢谢!
  • 感谢您的回复。根据您的回复,我提出了一个示例脚本来实现您的目标作为答案。你能确认一下吗?如果我误解了您的问题并且这不是您期望的方向,我深表歉意。

标签: javascript loops google-apps-script google-sheets conditional-statements


【解决方案1】:

我相信你的目标如下。

  • 您想从“零件”表的“C”和“N”列中检索值,并想检查“C”列中VIN # 的数量和yes 的数量是否相同在“N”列。
  • 当两个数字相同时,您希望将yes 放入“主”表的“I”列。
  • 您希望使用 Google Apps 脚本实现此目的。

这样的话,为了达到你的目的,下面的流程怎么样?

  1. 从“零件”表中检索值。
  2. 创建一个对象来检查VIN #yes的数量。
  3. 创建一个数组以放入“主”工作表。
  4. 将值放到“主”表中。

当这个流程反映到一个示例脚本时,它变成如下。

示例脚本:

function sample() {
  // 1. Retrieve values from "Master" sheet.
  var masterS = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Master");
  var valuesOfParts = partS.getRange("C5:N" + partS.getLastRow()).getValues();
  
  // 2. Create an object for checking the number of `VIN #` and `yes`.
  var obj = valuesOfParts.reduce((o, [c,,,,,,,,,,,n]) => {
    if (o[c]) {
      o[c].c += 1;
      if (n == "yes") o[c].yes += 1;
    } else {
      o[c] = {c: 1, yes: n == "yes" ? 1 : 0};
    }
    return o;
  }, {});

  // 3. Create an array for putting to the "Master" sheet.
  var partS = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Parts");
  var rangeOfMaster = masterS.getRange("B5:B" + masterS.getLastRow());
  var valuesOfMaster = rangeOfMaster.getValues().map(([b]) => [obj[b] && obj[b].c == obj[b].yes ? "yes" : ""]);

  // 4. Put the values to the "Master" sheet.
  rangeOfMaster.offset(0, 7).setValues(valuesOfMaster);
}

参考资料:

【讨论】:

  • 我想问一下这是做什么的(o, [c,,,,,,,,,,,n])?如果你不介意我问。再次感谢您!!!
  • @Juan M Guevara Martinez 关于(o, [c,,,,,,,,,,,n]),这是解构任务。 Ref 我用它来检索列“C”和“N”的值。因此,首先,通过一次调用检索列“C”到“N”的值,并使用[c,,,,,,,,,,,n] 检索每行的列“C”和“N”的值。在这种情况下,例如,当使用(o, e) 时,cn 也可以由e[0]e[e.length - 1] 写入。如果我的解释没有用,我深表歉意。
  • 我明白了,明白了,谢谢您的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2019-05-15
  • 2012-04-25
  • 1970-01-01
  • 2018-11-07
相关资源
最近更新 更多