Всем привет! Набросал скрипт для суммирования 3 дочерних таблиц в 1. Долго боролся с циклом, он не хотел сливать данные из цикла в пустую переменную var DataAll, и пришлось её обозначить как заголовок, как можно это обойти, и в целом какие косяки вы ещё видите в скрипте, вашим опытным взглядом?
[vba]
Код
function supercopy2() { var app = SpreadsheetApp; //Указываем ID целевой страницы var SheetID = 'Ваш АЙДИ'; //Задаем начальную строку массива (это заголовок из целевой таблицы) var DataAll = app.openById(SheetID).getSheetByName('Реестр').getRange(1, 1, 1, 4).getValues(); //Перечисляем мини реестры: var arrID = ['Ваш АЙДИ1', 'Ваш АЙДИ2', 'Ваш АЙДИ3'] var i = 1;
//Запускаем цикл while (i<=arrID.length){ //не забываем все листы называть одинаково var sss = app.openById(arrID[i-1]).getSheetByName('Лист1'); //Получаем нужные диапазоны var ss = sss.getRange('A2:D'+ sss.getLastRow().toString()); //Получаем данные из диапазонов var Data = ss.getValues(); //Объединяем массивы DataAll = DataAll.concat(Data); i++};
var numRows = DataAll.length; //Определяем целевую таблицу и диапазон куда вставлять полученные данные var ssV = app.openById(SheetID).getSheetByName('Реестр').getRange(1, 1, numRows, 4); var ss0 = app.openById(SheetID).getSheetByName('Реестр');//Указываем диапазон для очистки. //чистим лист ss0.clear({contentsOnly: true}); //вставляем данные ssV.setValues(DataAll); }
[/vba]
Всем привет! Набросал скрипт для суммирования 3 дочерних таблиц в 1. Долго боролся с циклом, он не хотел сливать данные из цикла в пустую переменную var DataAll, и пришлось её обозначить как заголовок, как можно это обойти, и в целом какие косяки вы ещё видите в скрипте, вашим опытным взглядом?
[vba]
Код
function supercopy2() { var app = SpreadsheetApp; //Указываем ID целевой страницы var SheetID = 'Ваш АЙДИ'; //Задаем начальную строку массива (это заголовок из целевой таблицы) var DataAll = app.openById(SheetID).getSheetByName('Реестр').getRange(1, 1, 1, 4).getValues(); //Перечисляем мини реестры: var arrID = ['Ваш АЙДИ1', 'Ваш АЙДИ2', 'Ваш АЙДИ3'] var i = 1;
//Запускаем цикл while (i<=arrID.length){ //не забываем все листы называть одинаково var sss = app.openById(arrID[i-1]).getSheetByName('Лист1'); //Получаем нужные диапазоны var ss = sss.getRange('A2:D'+ sss.getLastRow().toString()); //Получаем данные из диапазонов var Data = ss.getValues(); //Объединяем массивы DataAll = DataAll.concat(Data); i++};
var numRows = DataAll.length; //Определяем целевую таблицу и диапазон куда вставлять полученные данные var ssV = app.openById(SheetID).getSheetByName('Реестр').getRange(1, 1, numRows, 4); var ss0 = app.openById(SheetID).getSheetByName('Реестр');//Указываем диапазон для очистки. //чистим лист ss0.clear({contentsOnly: true}); //вставляем данные ssV.setValues(DataAll); }
Ну, во-первых, надо привыкать, что счетчик элементов массива в GAS (как и в JS) начинается с 0, а попытка искусственно начать цикл с 1 сразу обрастает лишним утомительным кодом. Тут надо избавляться от привычек VBA (хотя, грешным делом, сам всегда любил, чтобы индекс начинался с 1).
Во-вторых, цикл. При четко известном заранее максимальном i, равным длине массива минус 1, гораздо нагляднее использовать цикл for. В нём всё рядом в одной строке - и начало, и конец, и приращение: [vba]
//Получаем нужные диапазоны var ss = sss.getRange('A2:D'+ sss.getLastRow().toString());
".toString()" тут излишне, здесь строка и так "сложится" с числом как надо (как с & в VBA)
Переменная ss практически устойчиво в листингах GAS обозначает объект (s)pread(s)heet. Использовать ss для range - как-то совсем не комильфо (даже ни одной буквы не совпадает). Для диапазона лучше range или rng, для листа - sheet или sht. Помните о потенциальных читателях Вашего кода!
Ну, во-первых, надо привыкать, что счетчик элементов массива в GAS (как и в JS) начинается с 0, а попытка искусственно начать цикл с 1 сразу обрастает лишним утомительным кодом. Тут надо избавляться от привычек VBA (хотя, грешным делом, сам всегда любил, чтобы индекс начинался с 1).
Во-вторых, цикл. При четко известном заранее максимальном i, равным длине массива минус 1, гораздо нагляднее использовать цикл for. В нём всё рядом в одной строке - и начало, и конец, и приращение: [vba]
//Получаем нужные диапазоны var ss = sss.getRange('A2:D'+ sss.getLastRow().toString());
".toString()" тут излишне, здесь строка и так "сложится" с числом как надо (как с & в VBA)
Переменная ss практически устойчиво в листингах GAS обозначает объект (s)pread(s)heet. Использовать ss для range - как-то совсем не комильфо (даже ни одной буквы не совпадает). Для диапазона лучше range или rng, для листа - sheet или sht. Помните о потенциальных читателях Вашего кода!Gustav
Из-за дилетантности знаний, не все фишки знаю, попробую через, for, а с единицы я начал чисто интуитивно, потом еще допереть не мог почему он берет не все таблицы доноры. Вообще , я 3 часа голову ломал почему код не работает как надо, т.к. изначально задал var i = arrID.length
Из-за дилетантности знаний, не все фишки знаю, попробую через, for, а с единицы я начал чисто интуитивно, потом еще допереть не мог почему он берет не все таблицы доноры. Вообще , я 3 часа голову ломал почему код не работает как надо, т.к. изначально задал var i = arrID.length
это получается такой же массив форматов собирать со всех таблиц, пока воздержусь от нагромождений в коде, задал в общий реестр такие же форматы как в таблицах донорах, всё пока работает.
Вопрос по форматированию задал, потому что время как то не правильно переходило на 26 минут меньше), оказалось таблицы просто в разных часовых поясах были.
это получается такой же массив форматов собирать со всех таблиц, пока воздержусь от нагромождений в коде, задал в общий реестр такие же форматы как в таблицах донорах, всё пока работает.
Вопрос по форматированию задал, потому что время как то не правильно переходило на 26 минут меньше), оказалось таблицы просто в разных часовых поясах были.Kashimirush
Работа, работа, перейди на Федота...
Сообщение отредактировал Kashimirush - Понедельник, 02.03.2020, 15:34