Javascript Google脚本:每个唯一ID有多个条件

Javascript Google脚本:每个唯一ID有多个条件,javascript,loops,google-apps-script,google-sheets,conditional-statements,Javascript,Loops,Google Apps Script,Google Sheets,Conditional Statements,脚本将计算所有VIN编号重复的次数&如果该VIN编号(汽车)的所有零件都已到达 例如,如果VIN编号重复5次,则意味着将有五个零件到达,因此下一步是检查到达列,如果有5个“是”值,则 (重复VIN编号)5/5(是值的数量) 将触发它将该特定VIN编号的[主]选项卡零件订单列更改为“是” 用户将手动更新[零件]选项卡,在到达栏中添加是或留空。(如果为空,则零件未到达。) 请参阅google工作表模板的链接: 我的尝试: 获取列的最后一个值的特殊函数: 函数getLastRowSpecial(范围

脚本将计算所有VIN编号重复的次数&如果该VIN编号(汽车)的所有零件都已到达

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

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

将触发它将该特定VIN编号的[]选项卡零件订单列更改为“是”

用户将手动更新[零件]选项卡,在到达栏中添加留空。(如果为空,则零件未到达。)

请参阅google工作表模板的链接:

我的尝试:

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

函数getLastRowSpecial(范围){ var-rowNum=0; var blank=false; 对于(变量行=0;行
在这里,我可以计算每个VIN编号出现的次数,但无法计算每个唯一VIN编号的“是”值的数量。这需要是动态的。最后我的方法不是动态的。特别是关于var编号

主脚本:

/**--------------------------电子表格------------------**/
var masterS=SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“Master”);
var partS=SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“零件”);
/**------------单元格的选择范围----------------**/
/**-----零件数据表------**/
/**要匹配的VIN*/
var vinpartorderangep=partS.getRange(“C5:C”);
var vinPartValuesP=vinpartorderangep.getValues();
var columnCheckPartVINP=getLastRowSpecial(vinPartValuesP);
var partvindatarange=partS.getRange(5,3,columnCheckPartVINP,1);
var partsVinSetP=partVINDataRangeP.getValues();
/**部分到达*/
var partOrderedRange=partS.getRange(“N5:N”);
var partOrderedValuesP=partOrderedRange.getValues();
var partOrderedValuesRectLength=partOrderedValuesP.splice(0,partsVinceTP.length);
/**将VIN与到达的零件结合起来*/
var VINPARTSRIVEDP=[];
VIN零件驱动推送(零件插入,零件订购值垂直长度);
/**-----主数据表------**/
/**要匹配的VIN*/
var vinpartorderangem=masterS.getRange(“B5:B”);
var vinPartValuesM=vinPartOrderRangeM.getValues();
var columnCheckPartVINM=getLastRowSpecial(vinPartValuesM);
var partVINDataRangeM=masterS.getRange(5,2,columnCheckPartVINM,1);
var partsVinSetM=partVINDataRangeM.getValues();
/**部分到达*/
var partPastRangeM=masterS.getRange(“I5:I”);
var partPastValuesM=partPastRangeM.getValues();
/**----对于获取需要到达的零件数量的循环--**/
var VINNOUMBER=[],arrivalPartsRequired=[],prev;
对于(var i=0;i对于(var k=0;k我相信你的目标如下

  • 您需要从“零件”表的“C”列和“N”列中检索值,并需要检查“C”列中相同的
    VIN
    编号和“N”列中的
    yes
    编号是否相同
  • 当两个数字相同时,您希望将
    yes
    放入“主”工作表的“I”列
  • 您希望使用谷歌应用程序脚本实现这一点
在这种情况下,为了实现您的目标,下面的流程如何

  • 从“零件”表中检索值
  • 创建一个对象,用于检查
    VIN
    yes
    的编号
  • 创建一个数组以放入“主”工作表
  • 将值放入“主”表
  • 当这个流被反映到一个示例脚本中时,它变成如下所示

    示例脚本: 参考资料:

    不幸的是,我无法从你的问题中理解你当前的问题和你的目标。我为我糟糕的英语技能道歉。而且,你的样本电子表格就是输入情况?如果是这样,你能提供你期望的样本输出情况吗?是的,没问题。结果是如果汽车的所有零件都到达,然后更换masterlist,parts order列为yes,否则不会有任何更改。请参阅链接:感谢您添加更多信息。从您的示例电子表格中,我了解您的目标如下。您希望从“parts”表中的“C”和“N”列中检索值,并检查“C”列中相同的
    VIN
    的编号是否相同以及列“N”处的
    yes
    的编号,当两个编号相同时,您希望将
    yes
    放在的同一行
    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;
    };
    
          /** ---------------------- 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);
    
    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);
    }