当前位置: 首页 > 知识库问答 >
问题:

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

吴胜
2023-03-14

脚本会计算所有车辆识别号重复的次数

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

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

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

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

请参阅google工作表模板的链接: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;
};

主脚本:

      /** ---------------------- 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);

共有1个答案

宇文修筠
2023-03-14

我相信你的目标如下。

  • 您想要从部件表中的列C和N中检索值,并且想要检查列C处的相同VIN#的数量和列C处的yes的数量列N。
  • 当两个数字相同时,您要将yes放在Master表的I列中。
  • 您希望使用Google Apps脚本来实现这一点。

既然如此,为了达到你的目的,下面的流量如何?

  1. 从“零件”表中检索值
  2. 创建一个对象,用于检查VINyes的编号
  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);
}
  • reduce()
 类似资料:
  • 在上面的代码示例中,试图为每个请求生成唯一的txn-id。但是,观察到它正在重复使用相同的数字导致重复。我还尝试使用以下方法根据当前时间生成,当在1秒内触发超过1个请求时,它仍然会导致重复。 任何替代解决方案来为每个请求生成唯一ID,而不管并发情况如何? 提前感谢。

  • 问题内容: 我遇到了一个场景,为元素赋予属性可以轻松解决问题。然而,阅读后在元素W3Schools的和怪异模式,似乎这样做可能有一些无法预见的后果。 有没有人遇到诸如Chrome,Safari,FF3 up和IE 7 up之类的浏览器中的任何这些问题? 问题答案: 在目前所有的浏览器中都可以。 唯一出错的浏览器是Netscape 4,很久很久以前我们就停止在乎它。 该quirksmode页面似乎已

  • 然而,尽管我也想向发送相同的邮件,但这可能是我忽略了的一个非常简单的问题,但我想这里的人会马上知道它是什么。 为您的帮助干杯:) 编辑-我尝试使用: 但没有欢乐。 编辑2-我使用它: 这不是一段看起来最优美的代码,但它确实起到了作用...

  • 问题内容: 我有一个表格,其中包含所有新信息。该表用作所有新闻源查询的参考,因此从那里选择事件项,并从正确的表中检索与该事件相对应的信息。 现在,这是我的问题。我在事件表中有,它对应于不同表中事件的ID,例如for ,for 等等。这些ID可能相同,所以暂时我只是使用了一个不同的auto_increment值对于每个这样在500 上以0等开始的表。显然,我不想这样做,因为我还不知道哪个表中的数据最

  • 我是新来的,我在试图弄清楚这一点时遇到了一些困难。我有一个从谷歌表单收集数据的电子表格。我试图找到一种方法来移动数据的基础上列答案不同的谷歌表。(不是同一文档中的一张纸,而是一起的不同文档)。似乎有一些关于移动到同一文档中不同选项卡的信息,但不是不同的文档。 我首先要说的是,我只尝试了一个IMPORTRANGE函数,但这只反映了数据,不允许您更新或更改单元格。 这是我到目前为止能够拼凑出来的,但我

  • 问题内容: 我有以下SQLite代码。如何在每行中插入自动生成的唯一ID? 问题答案: 您可以将其定义为自动递增列: 正如MichaelDorner指出的那样,SQLite文档说an可以做同样的事情,并且速度稍快。该类型的列是其别名,其行为类似于自动增量列。 此行为是隐式的,可能会使经验不足的SQLite开发人员措手不及。