Ладно развели флуд в теме лишние посты почистите поожалуйста если это возможно, я поиске человека кто может помочь проксриптовать таблицу в наличе у меня скайп есть рк аська и т.д
Ладно развели флуд в теме лишние посты почистите поожалуйста если это возможно, я поиске человека кто может помочь проксриптовать таблицу в наличе у меня скайп есть рк аська и т.дNevsiy
На листе "Таблица DKP" есть колонки "DKP" и "Мейн". Я так понимаю, что в "DKP" хранятся суммы очков нарастающим итогом, а в "Мейн" - идентификатор участника. Пока правильно рассуждаю?
Далее. Откуда: с каких листов, из каких колонок надо брать новые суммы DKP и складывать их с DKP из первой таблицы?
На листе "Таблица DKP" есть колонки "DKP" и "Мейн". Я так понимаю, что в "DKP" хранятся суммы очков нарастающим итогом, а в "Мейн" - идентификатор участника. Пока правильно рассуждаю?
Далее. Откуда: с каких листов, из каких колонок надо брать новые суммы DKP и складывать их с DKP из первой таблицы?Gustav
Это только с листа "Рс". А что брать c "цлк" и "Накс" для этого мейна? Почему в таблицах совсем нет формул? Типа СУММ, например. Вообще не владеешь?Gustav
Gustav, С цлк и накса брать тоже числа которые в колонках записанны я с них скалдывал круглое число и потом выводил сколько всего Дкп за 3 рейда вышло то есть из таблиц брал все числа в колонках а не именные знаечения там где уже подсчитанно
Gustav, С цлк и накса брать тоже числа которые в колонках записанны я с них скалдывал круглое число и потом выводил сколько всего Дкп за 3 рейда вышло то есть из таблиц брал все числа в колонках а не именные знаечения там где уже подсчитанноNevsiy
Gustav, Там есть колонка в конце дкп за рейд весь то есть там где дкп в таблице Рс есть 90 ДКП в конце есть колонка дкп за рейд 145 То есть которые числа в колонках стоят я их посчтиал и вывел круглое число а откуда бралось 145 дкп это из 2 тех таблиц то есть к примеру у человека 0 дкп он за квартал или за босса зарабатывае оприделенное число дкп и в конце колонки я подсчитываю общее число из всех колонок и просто плюсую к основному число кторое в основной таблице дкп думаю я так яснее написал если нет я еще подробние напишу
Gustav, Там есть колонка в конце дкп за рейд весь то есть там где дкп в таблице Рс есть 90 ДКП в конце есть колонка дкп за рейд 145 То есть которые числа в колонках стоят я их посчтиал и вывел круглое число а откуда бралось 145 дкп это из 2 тех таблиц то есть к примеру у человека 0 дкп он за квартал или за босса зарабатывае оприделенное число дкп и в конце колонки я подсчитываю общее число из всех колонок и просто плюсую к основному число кторое в основной таблице дкп думаю я так яснее написал если нет я еще подробние напишуNevsiy
В общем, подход родился следующий. В файле таблицы Google имеется лист "Таблица DKP". На этом листе есть две интересующие нас колонки: идентификатор участника (т.н. "мейн", колонка C или 3-я на листе) и соответствующая этому участнику общая сумма DKP (некие баллы или очки за какие-то достижения в некой игре, колонка B или 2-я). Общие суммы DKP периодически наращиваются значениями, поступающими с других листов файла. Эти другие листы представляют собой в общем случае временные (перезатираемые) реестры достижений некоторых участников в некоторых этапах игры. Структура этих временных таблиц формализована довольно слабо, но явно просматриваются устойчивые блоки информации (прямоугольные диапазоны ячеек) из двух колонок: 1-я - Id участника, 2-я - очки (DKP) за этап.
Из-за временности существования таблиц этапов их постоянная формульная связь с основной "Таблицей DKP" не представляется возможной. В связи с этим предлагается следующий алгоритм переноса значений DKP из временных таблиц в постоянную при помощи скрипта. Пользователь выделяет мышкой прямоугольный диапазон на листе какого-либо этапа - из двух колонок: левая - id, правая - DKP. После выделения выбирается пункт верхнего меню "Моё меню \ Перенести ДКП". При выполнении этой команды каждое значение id из левой колонки выделенного диапазона ищется в колонке C листа "Таблица DKP". При нахождении происходит добавление (суммирование) значения DKP из правой колонки диапазона к соответствующему (в той же строке) значению колонки B "Таблицы DKP". Если же id не найдено в колонке C, пользователь получит предупреждение. В конце обработки диапазона на экран выдается протокол всех выполненных изменений (или НЕизменений/предупреждений). При желании/необходимости текст протокола может быть скопирован из всплывающего окна и сохранен.
Текст скрипта (3 функции) находится под спойлером. Нужно скопировать его и вставить в таблицу Google, воспользовавшись пунктом меню "Инструменты \ Редактор скриптов". После вставки скрипт необходимо сохранить и активировать (разрешить), запустив на выполнение функцию onOpen. Далее отреагировать (подтвердить) все возникающие сообщения, после чего закрыть файл таблицы и открыть заново. После повторного открытия в верхнем меню появится пункт "Моё меню". Далее действовать по описанному выше алгоритму.
[vba]
Код
function onOpen() {
var ui = SpreadsheetApp.getUi(); ui.createMenu('Моё меню') .addItem('Перенести ДКП из выделенного диапазона на любом листе', 'addSum') .addToUi(); }
function addSum() {
var ss = SpreadsheetApp.getActive();
// изучаем выделенный диапазон (на любом листе) // в этом диапазоне 1-колонка - Id, 2-я - сумма для добавления на лист назначения var rngSelection = ss.getActiveRange(); var valuesX = rngSelection.offset(0, 0, rngSelection.getNumRows(), 1).getValues(); var valuesY = rngSelection.offset(0, 1, rngSelection.getNumRows(), 1).getValues();
// лист назначения (наращиваемые суммы) var sheet = ss.getSheetByName('Таблица DKP'); var rngTarget = sheet.getDataRange(); var valuesXtrg = rngTarget.offset(0, 2, rngTarget.getNumRows(), 1).getValues();
// формируем одномерный массив значений Id для поиска // (считываем в память с листа назначения) var arr = []; for (var row in valuesXtrg) { arr[row] = valuesXtrg[row][0]; }
// бежим по выделенному диапазону, точнее уже по его значениям // находим очередной Id и наращиваем для него сумму на листе назначения logString = ''; for (var row in valuesX) { var pos = findElem(arr, valuesX[row][0]); if ( pos > 0 ) { var sum2add = valuesY[row][0]; // координаты ячейки с суммой var rowNum = Number(pos) + 1; var colNum = Number(2); var sumCell = sheet.getRange(rowNum, colNum); var newSum = sumCell.getValue() + sum2add; sumCell.setValue(newSum); logString += 'Сумма для ' + valuesX[row][0].toString() + ' в строке ' + pos + ' была увеличена на ' + sum2add + ' и теперь составляет ' + newSum + '\\n'; } else { logString += 'Не найдено значение ' + valuesX[row][0].toString() + '\\n'; // need to double-escape "\n" for historical reasons in Browser.msgBox } }
sheet.activate(); Browser.msgBox('Протокол изменений в Таблице DKP', logString, Browser.Buttons.OK); }
function findElem(array, value) { // заимствовано отсюда: http://red-book-cms.ru/poleznosti/javascript/poisk-elementa-v-massive-na-javascript.html // поиск ЧУВСТВИТЕЛЕН к регистру
/* Проверяем то, что наш браузер поддерживает indexOf: */ if ( [].indexOf ) { var find = function(array, value) { return array.indexOf(value); } /* В противном случае ищем самостоятельно: */ } else { var find = function(array, value) { for(var i=0, l = array.length; i < l; i++) { if (array[i] === value) return i; } return -1; } } return find(array, value); }
[/vba]
P.S. В процессе тестирования был замечен глюк (не очень понятный), когда после выбора команды меню "Перенести ДКП" возникала ошибка "отсутствия активного листа". Помогало простое закрытие таблицы и открытие ее заново, т.е. перезагрузка.
В общем, подход родился следующий. В файле таблицы Google имеется лист "Таблица DKP". На этом листе есть две интересующие нас колонки: идентификатор участника (т.н. "мейн", колонка C или 3-я на листе) и соответствующая этому участнику общая сумма DKP (некие баллы или очки за какие-то достижения в некой игре, колонка B или 2-я). Общие суммы DKP периодически наращиваются значениями, поступающими с других листов файла. Эти другие листы представляют собой в общем случае временные (перезатираемые) реестры достижений некоторых участников в некоторых этапах игры. Структура этих временных таблиц формализована довольно слабо, но явно просматриваются устойчивые блоки информации (прямоугольные диапазоны ячеек) из двух колонок: 1-я - Id участника, 2-я - очки (DKP) за этап.
Из-за временности существования таблиц этапов их постоянная формульная связь с основной "Таблицей DKP" не представляется возможной. В связи с этим предлагается следующий алгоритм переноса значений DKP из временных таблиц в постоянную при помощи скрипта. Пользователь выделяет мышкой прямоугольный диапазон на листе какого-либо этапа - из двух колонок: левая - id, правая - DKP. После выделения выбирается пункт верхнего меню "Моё меню \ Перенести ДКП". При выполнении этой команды каждое значение id из левой колонки выделенного диапазона ищется в колонке C листа "Таблица DKP". При нахождении происходит добавление (суммирование) значения DKP из правой колонки диапазона к соответствующему (в той же строке) значению колонки B "Таблицы DKP". Если же id не найдено в колонке C, пользователь получит предупреждение. В конце обработки диапазона на экран выдается протокол всех выполненных изменений (или НЕизменений/предупреждений). При желании/необходимости текст протокола может быть скопирован из всплывающего окна и сохранен.
Текст скрипта (3 функции) находится под спойлером. Нужно скопировать его и вставить в таблицу Google, воспользовавшись пунктом меню "Инструменты \ Редактор скриптов". После вставки скрипт необходимо сохранить и активировать (разрешить), запустив на выполнение функцию onOpen. Далее отреагировать (подтвердить) все возникающие сообщения, после чего закрыть файл таблицы и открыть заново. После повторного открытия в верхнем меню появится пункт "Моё меню". Далее действовать по описанному выше алгоритму.
[vba]
Код
function onOpen() {
var ui = SpreadsheetApp.getUi(); ui.createMenu('Моё меню') .addItem('Перенести ДКП из выделенного диапазона на любом листе', 'addSum') .addToUi(); }
function addSum() {
var ss = SpreadsheetApp.getActive();
// изучаем выделенный диапазон (на любом листе) // в этом диапазоне 1-колонка - Id, 2-я - сумма для добавления на лист назначения var rngSelection = ss.getActiveRange(); var valuesX = rngSelection.offset(0, 0, rngSelection.getNumRows(), 1).getValues(); var valuesY = rngSelection.offset(0, 1, rngSelection.getNumRows(), 1).getValues();
// лист назначения (наращиваемые суммы) var sheet = ss.getSheetByName('Таблица DKP'); var rngTarget = sheet.getDataRange(); var valuesXtrg = rngTarget.offset(0, 2, rngTarget.getNumRows(), 1).getValues();
// формируем одномерный массив значений Id для поиска // (считываем в память с листа назначения) var arr = []; for (var row in valuesXtrg) { arr[row] = valuesXtrg[row][0]; }
// бежим по выделенному диапазону, точнее уже по его значениям // находим очередной Id и наращиваем для него сумму на листе назначения logString = ''; for (var row in valuesX) { var pos = findElem(arr, valuesX[row][0]); if ( pos > 0 ) { var sum2add = valuesY[row][0]; // координаты ячейки с суммой var rowNum = Number(pos) + 1; var colNum = Number(2); var sumCell = sheet.getRange(rowNum, colNum); var newSum = sumCell.getValue() + sum2add; sumCell.setValue(newSum); logString += 'Сумма для ' + valuesX[row][0].toString() + ' в строке ' + pos + ' была увеличена на ' + sum2add + ' и теперь составляет ' + newSum + '\\n'; } else { logString += 'Не найдено значение ' + valuesX[row][0].toString() + '\\n'; // need to double-escape "\n" for historical reasons in Browser.msgBox } }
sheet.activate(); Browser.msgBox('Протокол изменений в Таблице DKP', logString, Browser.Buttons.OK); }
function findElem(array, value) { // заимствовано отсюда: http://red-book-cms.ru/poleznosti/javascript/poisk-elementa-v-massive-na-javascript.html // поиск ЧУВСТВИТЕЛЕН к регистру
/* Проверяем то, что наш браузер поддерживает indexOf: */ if ( [].indexOf ) { var find = function(array, value) { return array.indexOf(value); } /* В противном случае ищем самостоятельно: */ } else { var find = function(array, value) { for(var i=0, l = array.length; i < l; i++) { if (array[i] === value) return i; } return -1; } } return find(array, value); }
[/vba]
P.S. В процессе тестирования был замечен глюк (не очень понятный), когда после выбора команды меню "Перенести ДКП" возникала ошибка "отсутствия активного листа". Помогало простое закрытие таблицы и открытие ее заново, т.е. перезагрузка.Gustav
Gustav, Я короче сумарное значение вывожу формулой подвожу итог за все колонки и где колонка сумма я туда формулой подсчитывал все значения в колнока начиная от колонки дкп и дальше в которых колонках есть значения какие то я их просто складывал и выводил круглое число а где там в кололнке послдение дкп за рейд это сумарное число начиная с кого либо босса и заканчивая той колонкой где уже число заканчивается и просто выводил его круглым чичслом и там получалось круглое число в таблице основной дкп я просто так же считал ну вы мне уже скрипт помогли зделать прошу раскажите как и что им пользоватся где его запускать
Gustav, Я короче сумарное значение вывожу формулой подвожу итог за все колонки и где колонка сумма я туда формулой подсчитывал все значения в колнока начиная от колонки дкп и дальше в которых колонках есть значения какие то я их просто складывал и выводил круглое число а где там в кололнке послдение дкп за рейд это сумарное число начиная с кого либо босса и заканчивая той колонкой где уже число заканчивается и просто выводил его круглым чичслом и там получалось круглое число в таблице основной дкп я просто так же считал ну вы мне уже скрипт помогли зделать прошу раскажите как и что им пользоватся где его запускатьNevsiy
Создал копию исходной таблицы в своем Гугл-диске (делается через меню "Файл \ Создать копию" - этот пункт будет доступен, если войти в свой эккаунт Гугл):
При выделенном диапазоне N2:O7 на листе "Рc 25об 02.07" и выполнении команды меню "Моё меню \ Перенести ДКП..." получил запросы авторизации (что обычно и происходит при попытке первого выполнения кода): [vba]
Код
Требуется авторизация
The application "Перенос ДКП" needs authorization to run.
<Продолжить> Отмена
[/vba]
и затем:
[vba]
Код
Перенос ДКП запрашивает следующее:
Дополнительная информация
Просмотр и изменение таблиц на Google Диске
Нажмите, чтобы получить дополнительную информацию
Нажимая "Разрешить", вы разрешаете приложению и компании Google использовать ваши данные в соответствии с Условиями использования и политикой конфиденциальности. Вы можете изменить настройки доступа к аккаунту в любое время.
<Разрешить>
[/vba] Подтвердил их, получил следующий протокол отработки (это уже моих рук дело):
[vba]
Код
Протокол изменений в Таблице DKP
Сумма для Onlydmgsham в строке 1 была увеличена на 145 и теперь составляет 315 Сумма для Kiiska в строке 89 была увеличена на 105 и теперь составляет 205 Сумма для Gowet в строке 38 была увеличена на 55 и теперь составляет 190 Не найдено значение Pic Сумма для Qiwilol в строке 2 была увеличена на 130 и теперь составляет 285 Сумма для Lotarr в строке 19 была увеличена на 90 и теперь составляет 90
<ОК>
[/vba] Мораль: всё работает! Предлагаю скопировать к себе на Гугл-Диск этот мой демо-файл по моей ссылке и поразвлекаться с ним. Ещё раз - в нем всё работает!
Создал копию исходной таблицы в своем Гугл-диске (делается через меню "Файл \ Создать копию" - этот пункт будет доступен, если войти в свой эккаунт Гугл):
При выделенном диапазоне N2:O7 на листе "Рc 25об 02.07" и выполнении команды меню "Моё меню \ Перенести ДКП..." получил запросы авторизации (что обычно и происходит при попытке первого выполнения кода): [vba]
Код
Требуется авторизация
The application "Перенос ДКП" needs authorization to run.
<Продолжить> Отмена
[/vba]
и затем:
[vba]
Код
Перенос ДКП запрашивает следующее:
Дополнительная информация
Просмотр и изменение таблиц на Google Диске
Нажмите, чтобы получить дополнительную информацию
Нажимая "Разрешить", вы разрешаете приложению и компании Google использовать ваши данные в соответствии с Условиями использования и политикой конфиденциальности. Вы можете изменить настройки доступа к аккаунту в любое время.
<Разрешить>
[/vba] Подтвердил их, получил следующий протокол отработки (это уже моих рук дело):
[vba]
Код
Протокол изменений в Таблице DKP
Сумма для Onlydmgsham в строке 1 была увеличена на 145 и теперь составляет 315 Сумма для Kiiska в строке 89 была увеличена на 105 и теперь составляет 205 Сумма для Gowet в строке 38 была увеличена на 55 и теперь составляет 190 Не найдено значение Pic Сумма для Qiwilol в строке 2 была увеличена на 130 и теперь составляет 285 Сумма для Lotarr в строке 19 была увеличена на 90 и теперь составляет 90
<ОК>
[/vba] Мораль: всё работает! Предлагаю скопировать к себе на Гугл-Диск этот мой демо-файл по моей ссылке и поразвлекаться с ним. Ещё раз - в нем всё работает!Gustav