Скрипт приложений Google Sheets копирует строку данных, если дата совпадает с именем вкладки

#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. Мариос, я ценю время, которое вам потребовалось для этого. большое вам спасибо