Я пытаюсь получить диапазоны со всех вкладок и поместить значения на конкретную вкладку под названием «Данные» в столбце P
.
У меня есть значения диапазона A2:B
между всеми вкладками, и я пытаюсь получить значения методом сопоставления.
Проблема в том, что каждая из вкладок имеет значение приращения срабатывания в массиве, поэтому оно не будет правильно помещено в данные и сработает только с последней вкладки.
Меня судят:
function myFn() {
const ss = SpreadsheetApp.openById("id");
const forSheets = ss.getSheets();
const skip = ['Data'];
const ssData = ss.getSheetByName('Data');
forSheets.forEach(sheet => {
if (!skip.includes(sheet.getName())) {
const ssd = ssData.getRange("A2:B" + ssData.getLastRow()).getValues();
const tabs = sheet.getRange("A2:E").getValues();
const obj1 = new Map(tabs.map(([a, b, c, d, e]) => [`${a}${b}`, e]));
const res = ssd.map(([a, b]) => [obj1.get(`${a}${b}`) || null]);
ssData.getRange("P2:P").setValues(res);
console.info(res)
}
})
}
Существует несколько вкладок, одна из которых называется «данные», а остальные — и теперь, просто для целей тестирования, значения расположены в строках:
Другое вкладка1
[ [ 31 ], [ 62 ], [ 88], [ null ], [ null ], [ null ],]
Другое tab2
[ [ null ], [ null ], [ null ], [ 998 ], [ 262], [ 129 ],]
Кажется, мне нужно что-то вроде этого, чтобы решить проблему или объединить все массивы вкладок: Как?
Другое вкладка1
[ [ 31 ], [ 62 ], [ 88 ], [ null ], [ null ], [ null ],]
Другое tab2
[ [ 221 ], [ 998 ], [ 262 ], [ null ], [ null ], [ null ],]
На вкладке «Данные» я получаю значение * только из значений последней вкладки.
Не могли бы вы добавить ожидаемые результаты для первого и второго набора примеров?
@smallpepperz, Вопрос обновлен и добавлена демонстрационная таблица, пожалуйста, проверьте сейчас.
@sona, я заметил, что некоторые столбцы на других листах между данными пусты. Будут ли в этих столбцах другие данные? Будет ли это означать, что вам нужны только столбцы A, B и E?
Вы можете объединить все данные на других листах, используя getSheets()
, map()
и filter()
.
Вы можете обратиться к sample script
ниже:
function collectData2() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var data = ss.getSheets().filter(sheet => sheet.getName() != "Data").map(x => x.getDataRange().getValues());
data.map(x => x.shift());
data1 = data.flat().map(x => x.filter((y, i) => (i == 0) + (i == 1) + (i == 4)));
var data0 = ss.getSheetByName("Data").getRange(2, 1, ss.getSheetByName("Data").getLastRow() - 1, 2).getValues();
var out = data0.map(x => data1.filter(y => (y[0] == x[0])*((y[1] == x[1]))).map(z => z[2])).map(a => a.length > 0 ? a : [null])
SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Data").getRange(2, 16, out.length, 1).setValues(out);
}
Я вручную задал столбец для извлечения. Вывод этого сценария должен выглядеть следующим образом:
при этом я пробовал случайные выборки, чтобы проверить, действительно ли скрипт искал значения на основе столбцов A и B.
Пожалуйста, не стесняйтесь спрашивать что-либо относительно ответа, опубликованного выше.
После совпадения A1: B на обеих вкладках мне нужно объединить только столбец E
, чтобы я мог поместить его в столбец P
на вкладке «Данные».
Я добавил обновление. Я включил столбцы A и B только в начало ответа, чтобы показать, что данные расположены в правильном порядке.
Да, я понимаю, что массив объединяется, но он несовместим с моим сценарием. Вы пытались установить значения?
SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Data").getRange(2,16,data.length,1).setValues(data);
работает на моей стороне. Могу я узнать, как ты это сделал со своей стороны?
данные отвечают с ошибкой. Exception: The number of columns in the data does not match the number of columns in the range. The data has 0 but the range has 1.
Давайте продолжим обсуждение в чате.
иногда это работает, но в основном выдает такую ошибку Exception: The number of columns in the data does not match the number of columns in the range. The data has 296 but the range has 1.
Вы пытаетесь записать в «Данные» только ненулевые значения, чтобы пустые значения не перезаписывали существующие? Или вы пытаетесь сгруппировать их так, чтобы все значения отображались в таблице данных независимо от того, перекрываются ли они на других вкладках?