【发布时间】: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