Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Скрипт объединения нескольких таблиц в одну - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, китин  
Скрипт объединения нескольких таблиц в одну
Kashimirush Дата: Четверг, 27.02.2020, 15:50 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 240
Репутация: 41 ±
Замечаний: 0% ±

Excel 2010
Всем привет!
Набросал скрипт для суммирования 3 дочерних таблиц в 1. Долго боролся с циклом, он не хотел сливать данные из цикла в пустую переменную var DataAll, и пришлось её обозначить как заголовок, как можно это обойти, и в целом какие косяки вы ещё видите в скрипте, вашим опытным взглядом?


Работа, работа, перейди на Федота...
 
Ответить
СообщениеВсем привет!
Набросал скрипт для суммирования 3 дочерних таблиц в 1. Долго боролся с циклом, он не хотел сливать данные из цикла в пустую переменную var DataAll, и пришлось её обозначить как заголовок, как можно это обойти, и в целом какие косяки вы ещё видите в скрипте, вашим опытным взглядом?

Автор - Kashimirush
Дата добавления - 27.02.2020 в 15:50
Gustav Дата: Четверг, 27.02.2020, 18:13 | Сообщение № 2
Группа: Админы
Ранг: Участник клуба
Сообщений: 2792
Репутация: 1155 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
не хотел сливать данные из цикла в пустую переменную var DataAll, и пришлось её обозначить как заголовок, как можно это обойти

Объявить как пустой массив:
[vba]
Код
var DataAll = [];
[/vba]

var app = SpreadsheetApp;

ИМХО (ниже всё ИМХО - можно слушать меня, а можно и нет), излишне, ничего не экономится, а с толку при чтении кода сбивает

var i = 1;

//Запускаем цикл
while (i<=arrID.length){

Ну, во-первых, надо привыкать, что счетчик элементов массива в GAS (как и в JS) начинается с 0, а попытка искусственно начать цикл с 1 сразу обрастает лишним утомительным кодом. Тут надо избавляться от привычек VBA (хотя, грешным делом, сам всегда любил, чтобы индекс начинался с 1).

Во-вторых, цикл. При четко известном заранее максимальном i, равным длине массива минус 1, гораздо нагляднее использовать цикл for. В нём всё рядом в одной строке - и начало, и конец, и приращение:
[vba]
Код
for (var i = 0; i < arrID.length; i++) {
}
[/vba]

//Получаем нужные диапазоны
var ss = sss.getRange('A2:D'+ sss.getLastRow().toString());

".toString()" тут излишне, здесь строка и так "сложится" с числом как надо (как с & в VBA)

Переменная ss практически устойчиво в листингах GAS обозначает объект (s)pread(s)heet. Использовать ss для range - как-то совсем не комильфо (даже ни одной буквы не совпадает). Для диапазона лучше range или rng, для листа - sheet или sht. Помните о потенциальных читателях Вашего кода!


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Четверг, 27.02.2020, 19:19
 
Ответить
Сообщение
не хотел сливать данные из цикла в пустую переменную var DataAll, и пришлось её обозначить как заголовок, как можно это обойти

Объявить как пустой массив:
[vba]
Код
var DataAll = [];
[/vba]

var app = SpreadsheetApp;

ИМХО (ниже всё ИМХО - можно слушать меня, а можно и нет), излишне, ничего не экономится, а с толку при чтении кода сбивает

var i = 1;

//Запускаем цикл
while (i<=arrID.length){

Ну, во-первых, надо привыкать, что счетчик элементов массива в GAS (как и в JS) начинается с 0, а попытка искусственно начать цикл с 1 сразу обрастает лишним утомительным кодом. Тут надо избавляться от привычек VBA (хотя, грешным делом, сам всегда любил, чтобы индекс начинался с 1).

Во-вторых, цикл. При четко известном заранее максимальном i, равным длине массива минус 1, гораздо нагляднее использовать цикл for. В нём всё рядом в одной строке - и начало, и конец, и приращение:
[vba]
Код
for (var i = 0; i < arrID.length; i++) {
}
[/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
Дата добавления - 27.02.2020 в 18:13
anvg Дата: Четверг, 27.02.2020, 21:33 | Сообщение № 3
Группа: Друзья
Ранг: Ветеран
Сообщений: 581
Репутация: 271 ±
Замечаний: 0% ±

2016, 365
Доброе время суток.
Ещё один вариант сбора голой (ну, почти) функциональщиной :) без явного цикла.
[vba]
Код
 
    const app = SreadsheetApp;
    const dataAll = [
        'Ваш АЙДИ1',
        'Ваш АЙДИ2',
        'Ваш АЙДИ3'
    ].reduce(function (combo, nextName) {
        const sheet = app.openById(nextName).getSheetByName('Лист1');
        const sourceRange = sheet.getRange('A2:D' + sheet.getLastRow());
        return combo.concat(sourceRange.getValues());
    }, []); // последнее, можно и заголовком - вдруг надо? [['ColA', 'ColB', 'ColC', 'ColD']]
[/vba]


Сообщение отредактировал anvg - Четверг, 27.02.2020, 21:34
 
Ответить
СообщениеДоброе время суток.
Ещё один вариант сбора голой (ну, почти) функциональщиной :) без явного цикла.
[vba]
Код
 
    const app = SreadsheetApp;
    const dataAll = [
        'Ваш АЙДИ1',
        'Ваш АЙДИ2',
        'Ваш АЙДИ3'
    ].reduce(function (combo, nextName) {
        const sheet = app.openById(nextName).getSheetByName('Лист1');
        const sourceRange = sheet.getRange('A2:D' + sheet.getLastRow());
        return combo.concat(sourceRange.getValues());
    }, []); // последнее, можно и заголовком - вдруг надо? [['ColA', 'ColB', 'ColC', 'ColD']]
[/vba]

Автор - anvg
Дата добавления - 27.02.2020 в 21:33
Kashimirush Дата: Пятница, 28.02.2020, 07:52 | Сообщение № 4
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 240
Репутация: 41 ±
Замечаний: 0% ±

Excel 2010
Объявить как пустой массив:

Работает, я не верно задавал var DataAll = [[],[]]
гораздо нагляднее использовать цикл for.

Из-за дилетантности знаний, не все фишки знаю, попробую через, for, а с единицы я начал чисто интуитивно, потом еще допереть не мог почему он берет не все таблицы доноры.
Вообще , я 3 часа голову ломал почему код не работает как надо, т.к. изначально задал var i = arrID.length
.toString()" тут излишне

Честно говоря как этот метод работает я даже не представляю, тупо скопировал из работающего кода, другой таблицы.


Работа, работа, перейди на Федота...
 
Ответить
Сообщение
Объявить как пустой массив:

Работает, я не верно задавал var DataAll = [[],[]]
гораздо нагляднее использовать цикл for.

Из-за дилетантности знаний, не все фишки знаю, попробую через, for, а с единицы я начал чисто интуитивно, потом еще допереть не мог почему он берет не все таблицы доноры.
Вообще , я 3 часа голову ломал почему код не работает как надо, т.к. изначально задал var i = arrID.length
.toString()" тут излишне

Честно говоря как этот метод работает я даже не представляю, тупо скопировал из работающего кода, другой таблицы.

Автор - Kashimirush
Дата добавления - 28.02.2020 в 07:52
Kashimirush Дата: Пятница, 28.02.2020, 07:55 | Сообщение № 5
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 240
Репутация: 41 ±
Замечаний: 0% ±

Excel 2010
var app = SpreadsheetApp;

Тут не понял в чем проблема?


Работа, работа, перейди на Федота...
 
Ответить
Сообщение
var app = SpreadsheetApp;

Тут не понял в чем проблема?

Автор - Kashimirush
Дата добавления - 28.02.2020 в 07:55
Kashimirush Дата: Пятница, 28.02.2020, 07:56 | Сообщение № 6
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 240
Репутация: 41 ±
Замечаний: 0% ±

Excel 2010
anvg, А есть преимущества/недостатки, в чем разница методов?


Работа, работа, перейди на Федота...
 
Ответить
Сообщениеanvg, А есть преимущества/недостатки, в чем разница методов?

Автор - Kashimirush
Дата добавления - 28.02.2020 в 07:56
Kashimirush Дата: Пятница, 28.02.2020, 08:59 | Сообщение № 7
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 240
Репутация: 41 ±
Замечаний: 0% ±

Excel 2010
И еще вопрос по поводу формата данных, как сохранить формат данных из таблиц исходников?


Работа, работа, перейди на Федота...
 
Ответить
СообщениеИ еще вопрос по поводу формата данных, как сохранить формат данных из таблиц исходников?

Автор - Kashimirush
Дата добавления - 28.02.2020 в 08:59
anvg Дата: Пятница, 28.02.2020, 11:09 | Сообщение № 8
Группа: Друзья
Ранг: Ветеран
Сообщений: 581
Репутация: 271 ±
Замечаний: 0% ±

2016, 365
в чем разница методов?
разница в подходах: процедурный для for, while и функциональный для forEach, map, filter, reduce и т. д.. По большому счёту - дело вкуса.

как сохранить формат данных из таблиц исходников?
Точно также как и со значениями. getTextStyles, getNumberFormats и т. д. сведение в общий массив и обратно setTextStyles, setNumberFormats...
 
Ответить
Сообщение
в чем разница методов?
разница в подходах: процедурный для for, while и функциональный для forEach, map, filter, reduce и т. д.. По большому счёту - дело вкуса.

как сохранить формат данных из таблиц исходников?
Точно также как и со значениями. getTextStyles, getNumberFormats и т. д. сведение в общий массив и обратно setTextStyles, setNumberFormats...

Автор - anvg
Дата добавления - 28.02.2020 в 11:09
Kashimirush Дата: Понедельник, 02.03.2020, 15:29 | Сообщение № 9
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 240
Репутация: 41 ±
Замечаний: 0% ±

Excel 2010
Вот что получилось итоговый скрипт V4.2

Точно также как и со значениями.
это получается такой же массив форматов собирать со всех таблиц, пока воздержусь от нагромождений в коде, задал в общий реестр такие же форматы как в таблицах донорах, всё пока работает.

Вопрос по форматированию задал, потому что время как то не правильно переходило на 26 минут меньше), оказалось таблицы просто в разных часовых поясах были.


Работа, работа, перейди на Федота...

Сообщение отредактировал Kashimirush - Понедельник, 02.03.2020, 15:34
 
Ответить
СообщениеВот что получилось итоговый скрипт V4.2

Точно также как и со значениями.
это получается такой же массив форматов собирать со всех таблиц, пока воздержусь от нагромождений в коде, задал в общий реестр такие же форматы как в таблицах донорах, всё пока работает.

Вопрос по форматированию задал, потому что время как то не правильно переходило на 26 минут меньше), оказалось таблицы просто в разных часовых поясах были.

Автор - Kashimirush
Дата добавления - 02.03.2020 в 15:29
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!