[英]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;
};
主腳本:
/** ---------------------- 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);
我相信你的目標如下。
VIN #
的數量和“N”列的“ yes
”的數量.yes
”。在這種情況下,為了實現你的目標,下面的流程怎么樣?
VIN #
和yes
的數量。當這個流程反映到一個示例腳本時,它變成如下。
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.