簡體   English   中英

Google Script:每個唯一 ID 有多個條件

[英]Google Script: Multiple conditions per unique ID

該腳本將計算所有 VIN 號碼重復的次數以及是否所有部件都已到達該 VIN 號碼(汽車)。

例如,如果VIN 編號重復 5 次,則意味着有五個零件將到達,那么下一步將檢查到達的列中的此類 VIN,如果有5 個“是”值,那么

(VIN 號重復) 5/5(“是”值的數量)

將觸發它將 [ Master ] 選項卡的 Parts Order 列更改為該特定 VIN 號“是”

用戶將手動更新 [零件] 選項卡,到達列時選擇“是”留空 (如果空白,則零件尚未到達。)

請參閱谷歌表格模板的鏈接: https://docs.google.com/spreadsheets/d/1wlGV_QCWpRwmI5FWiOli6lXuzRATy_Goygp3lhtm-Ek/edit?usp=sharing

我的嘗試:

特殊 function 獲取一列的最后一個值:

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

我相信你的目標如下。

  • 您想從“零件”表的“C”和“N”列中檢索值,並想檢查“C”列的相同VIN #的數量和“N”列的“ yes ”的數量.
  • 當兩個數字相同時,您想在“主”表的“I”列中輸入“ yes ”。
  • 您想使用 Google Apps 腳本實現此目的。

在這種情況下,為了實現你的目標,下面的流程怎么樣?

  1. 從“零件”表中檢索值。
  2. 創建一個 object 用於檢查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);
}

參考:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM