#javascript #google-apps-script #google-sheets
#javascript #google-apps-script #google-sheets
Вопрос:
Я нашел некоторый код, который почти делает то, что мне нужно, и попытался поиграть с ним, чтобы заставить его работать, но безуспешно. Я получаю экспорт с данными с датами в последнем столбце в каждой строке.
Я просто хочу скопировать последние строки столбцов дат на вкладки с тем же именем.
function MoveDate_FourthDEC() {
var ss=SpreadsheetApp.getActive();
var sh1=ss.getSheetByName("Import");
var sh2=ss.getSheetByName("4/12/2020");
var rg1=sh1.getRange(2,1,sh1.getLastRow(),32);//starting at column2
var data=rg1.getValues();
for(var i=0;i<data.length;i ) {
// 13 = collected should be in this column which is column N
if(data[i][31]=="4/12/2020") {
sh2.appendRow(data[i]);
}}}
Ответ №1:
Объяснение:
-
Ваша цель — скопировать все строки, столбец
AF
которых соответствует названиям листов. -
Для начала вы можете использовать forEach() для перебора каждого листа. Для каждого листа вы хотите проверить, совпадает ли имя листа с датой в столбце
AF
. Если это так, то вам нужно отфильтровать только строки, содержащие эту дату в столбцеAF
, и сохранить их во временном массиве:let temp_data = data.filter(r=>r[31]==sh.getName());
-
Затем вы можете эффективно скопировать и вставить все соответствующие строки в соответствующий лист:
sh.getRange(sh.getLastRow() 1,1,temp_data.length,temp_data[0].length).setValues(temp_data);
Примечания:
-
При работе с объектами даты необходимо учитывать отображаемые значения на листе. Вот почему я использую getDisplayValues вместо getValues .
-
Поскольку
data
начинается со второй строки, вам нужно вычесть одну строку из последней строки с содержимым, чтобы получить правильный диапазон:getRange(2,1,sh1.getLastRow()-1,32)
-
Я использую includes, чтобы проверить, соответствует ли имя листа последнему столбцу. Для использования
includes
вам необходимо выровнять десятимерный 2D-массив, возвращаемыйgetDisplayValues
функцией.
Решение:
function MoveDate_FourthDEC() {
const ss = SpreadsheetApp.getActive();
const sh1 = ss.getSheetByName("Import");
const shs = ss.getSheets();
const dts = sh1.getRange('AF2:AF' sh1.getLastRow()).getDisplayValues().flat();
const data=sh1.getRange(2,1,sh1.getLastRow()-1,32).getDisplayValues();
shs.forEach(sh=>{
if (dts.includes(sh.getName())){
let temp_data = data.filter(r=>r[31]==sh.getName());
sh.getRange(sh.getLastRow() 1,1,temp_data.length,temp_data[0].length).setValues(temp_data);
}});
}
Комментарии:
1. Мариос, я ценю время, которое вам потребовалось для этого. большое вам спасибо