Вывод данных по условию Google Apps Script
Всем добрый день. Прошу вашей помощи, профессионалы. Есть следующая задача: вывести в ячейки таблицы значение "1" при условии, что значения в диапазоне А2:С4 будут совпадать с значениями в диапазоне строки D1:L1. При всем при этом "1" должна быть выведена в диапазоне D2:L4 в той же строке, что и искомые значения диапазона А2:С4 и в той же колонке, что и искомые значения диапазона D1:L1. Прилагаю скрин таблицы, как это должно выглядеть.
Так же прикладываю последнюю из наверное 50 вариаций кода.
function getAndSetDate() {
let app = SpreadsheetApp;
let ss = app.getActiveSpreadsheet();
let namess = ss.getSheetByName("ТЕСТ");
let lastRow = namess.getLastRow();
let lastColumn = namess.getLastColumn();
let dateRow = namess.getRange(1, 4, 1, lastColumn-3).getValues();
let dateColumn = namess.getRange(2, 1,lastRow-1, lastColumn-9).getValues();
let dateEmpty = namess.getRange(2, 4, lastRow-1, dateRow[0].length).getValues();
let one = 1;
let nan = '';
let idxDateRow = 0;
let idxDateEmpty = 0;
// let idxDateRow2 = 0;
// let idxDateEmptyRow = 0;
for(let row = 0; row < dateColumn.length; row++){
for(let col = 0; col < dateColumn[0].length; col++){
for(let drow = 0; drow < dateRow.length; drow++){
for(let dcol = 0; dcol < dateRow[0].length; dcol++){
for(let derow = 0; derow < dateEmpty.length; derow++){
for(let decol = 0; decol < dateEmpty[0].length; decol++){
dateEmpty[derow].forEach((deelem, deindex) =>{
dateRow[drow].forEach((delem,dindex) =>{
if(dateColumn.indexOf(idxDateRow) == dateEmpty.indexOf(idxDateEmpty) && dateColumn[row][col] == dateRow[drow][dcol] && deindex == dindex){
dateEmpty[derow][decol] = one;
}else{
dateEmpty[derow][decol] = nan;
};
});
idxDateRow +=1;
idxDateEmpty +=1;
idxDateEmptyRow +=1;
idxDateRow2 +=1;
});
};
};
};
};
};
};
console.log(dateEmpty);
};
С кодом просто уже полный кошмар. Уже что только не делал. Какие только методы перебора массивов не использовал. Все без толку. Прошу не судить строго. Я только учусь. Конструктивная критика и разъяснения будут только приветствоваться.
Ответы (1 шт):
Довольно странное задание. Попробуйте обрабатывать как сплошной массив разнородных данных.
function myFunction() {
const book = SpreadsheetApp.getActiveSpreadsheet();
const sheet = book.getSheetByName('Лист');
const range = sheet.getRange('A1:L4');
const values = range.getValues();
range.setValues(calculate_(values));
}
/**
* @param {any[][]} values
* @returns {any[][]}
*/
function calculate_(values) {
return values.map((row, i) => {
const collection = row.slice(0, 3);
return row.map(((cell, j) => {
if (i < 1 || j < 3) return cell;
const header = values[0][j];
return collection.includes(header) ? 1 : '';
}));
});
}
Т.е. необходимо обойти весь массив построчно и поколоночно, исключить заголовки, а в нужных ячейках вывести единицы. Если ячейка не совпадает по условию, то пробел.
Пример в Таблице https://docs.google.com/spreadsheets/d/1paJxOTNK01CEp9swCCdF7tVkC57OFRMPl9ZRcW_pC_k/edit?usp=sharing