У меня есть массив, который я хочу проверить на предмет значений во втором и четвертом столбце. Если я перейду к функции GWPA4205022
и 1550
Я хочу, чтобы функция:
- найти в массиве все совпадения с
GWPA4205022
- найти лучшую комбинацию элементов, сумма которой близка к
1550
- если это меньше чем
1550
тогда он должен найти другойGWPA4205022
в массиве и поместите его значение, чтобы общая сумма была1550
поэтому пример вывода должен быть:
var output = [[HAT, GWPA4205022, L00057275, 50.0, , , , 1166P92851, , , , 4720025365 ], [HAT, GWPA4205022, L00063746, 1000.0, , , , 1161P38051, , , , 4720021465 ], [HAT, GWPA4205022, L00063743, 100.0, , , , 1165P95951, , , , 4720024322 ], [HAT, GWPA4205022, L00063743, 100.0, , , , 1166P04351, , , , 4720024534 ], [HAT, GWPA4205022, L00056983, 300.0, , , , 1166P43451, , , , 4720025060 ]];
Функция выполняет свою работу, но мне интересно, есть ли более эффективный способ написать такой макрос?
Я впервые использую такой сложный макрос, поэтому я хотел бы узнать больше о других возможностях, и, возможно, в какой-то части моего кода я ошибаюсь. В некоторых случаях мне удавалось проверить, что он выполняет свою работу.
var arrToCheck = [
["HAT", "GWPA4205022", "L00063746", 1000.0, , , , "1161P38051", , , , 4720021465 ],
["HAT", "GWPA4205022", "L00063743", 100.0, , , , "1165P95951", , , , 4720024322 ],
["HAT", "GWPA4205022", "L00063743", 100.0, , , , "1166P04351", , , , 4720024534 ],
["HAT", "GWPA4205022", "L00056983", 300.0, , , , "1166P43451", , , , 4720025060 ],
["HAT", "GWPA4205022", "L00057275", 200.0, , , , "1166P92851", , , , 4720025365 ],
["INT 80C", "CWPA8005121", "L00057064", 600.0, , , , "1166P78351", , , , 4720025137 ],
["INT 80C", "CWPA8005121", "L00057275", 500.0, , , , "1166P92351", , , , 4720025365 ]
]
var productToCheck = "GWPA4205022";
var sumCheck = 1550;
function item1(valuesToCheck,sumToCheck) {
const sheetName = "AIRHLP"; // Please set the sheet name.
const sheetName1 = "対象部品コード"; // Please set the sheet name.
const sheetName2 = "AIR "; // Please set the sheet name.
// 1. Retrieve values from sheet.
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName(sheetName);
const sheet1 = ss.getSheetByName(sheetName1);
const sheet2 = ss.getSheetByName(sheetName2);
//const values = sheet.getRange(4, 3, sheet.getLastRow() - 3, 12).getValues();
//const valuesToCheck = sheet1.getRange(4, 2).getValue();
//const sumToCheck = sheet1.getRange(4, 3).getValue();
const values = arrToCheck;
console.log(values);
var arr = [];
for(var i = 0; i < values.length; i++){
if(values[i][1] === valuesToCheck){
arr.push(values[i][3]);
}
};
console.log(arr);
//------------------------Subset Sum Check--------------------------------------------
function getCombinations(array, sum) {
function add(a, b) { return a + b; }
function fork(i, t) {
var r = (result[0] || []).reduce(add, 0),
s = t.reduce(add, 0);
if (i === array.length || s > sum) {
if (s <= sum && t.length && r <= s) {
if (r < s) {
result = [];
}
result.push
}
return;
}
fork(i + 1, t.concat([array[i]]));
fork(i + 1, t);
}
var result = [];
fork(0, []);
return result;
}
const noweAr = getCombinations(arr, sumToCheck);
var check = noweAr[0];
console.log(check);
//-------------------------Position in Array---------------------------------------------------------
function getUniqueIndexes(array, check) {
// copy array to prevent mutation
var arr = array.slice()
// loop through `check`
const indeks = check.reduce((acc, cur) => {
// find index of the current value
var i = arr.indexOf(cur)
if (i !== -1) {
// erase the value to prevent further matches
arr[i] = null
// return the acumulator with the new index for each loop
return [...acc, i]
}
}, [])
return indeks
}
const indeks = getUniqueIndexes(arr, check)
console.log(indeks);
//-------------------------Total Check----------------------------------------------------------
var sumCheckArray = check.reduce((a, b) => a + b, 0);
var first = arr.length;
var second = [];
for (var i=0;i<=first;i++) {
second.push(i);
console.log(second);
}
function arr_diff (a1, a2) {
var a = [], diff = [];
for (var i = 0; i < a1.length; i++) {
a[a1[i]] = true;
}
for (var i = 0; i < a2.length; i++) {
if (a[a2[i]]) {
delete a[a2[i]];
} else {
a[a2[i]] = true;
}
}
for (var k in a) {
diff.push(k);
}
return diff;
}
const toLook = arr_diff(second,indeks);
console.log(toLook);
var pasujace = [];
var nowatabelka = [];
var roznica = sumToCheck - sumCheckArray;
if(sumCheckArray != sumCheckArray){
for(var i = 0; i < indeks.length; i++){
nowatabelka.push(values[indeks[i]]);
}} else {
for(var i = 0; i < toLook.length; i++){
if(arr[toLook[i]] > roznica){
pasujace.push(toLook[i],arr[toLook[i]])
} else if (pasujace === undefined){
pasujace.push(0,0,3);
}Logger.log(pasujace);
values[pasujace[0]][3] = roznica // TUTAJ ZMIENIC
}
nowatabelka.push(values[toLook[0]]);
for(var i = 0; i < indeks.length; i++){
nowatabelka.push(values[indeks[i]]);
}
}
console.log(pasujace);
console.log(nowatabelka);
console.log(nowatabelka.length);
//------------------Insert Data-------------------------------------------
var getLast = sheet2.getLastRow() + 1;
const resultRange = sheet2.getRange(getLast, 3,nowatabelka.length, 12);
var result = resultRange.setValues(nowatabelka);
console.log(getLast);
}
item1(productToCheck, sumCheck);