function onOpen() { var ui = SpreadsheetApp.getUi(); ui.createMenu('Моё меню') .addSubMenu(ui.createMenu('Перенести ДКП из выделенного диапазона на любом листе') .addItem('ПРИБАВИТЬ значения из крайнего ПРАВОГО столбца выделения', 'addSumRight') .addItem('ПРИБАВИТЬ значения из крайнего ЛЕВОГО столбца выделения', 'addSumLeft') .addItem('ОТНЯТЬ значения из крайнего ПРАВОГО столбца выделения', 'subtractSumRight') .addItem('ОТНЯТЬ значения из крайнего ЛЕВОГО столбца выделения', 'subtractSumLeft')) .addToUi(); } function addSumRight() { addSumBase(1,1); // вправо (direct=1) и сложить (oper=1) } function addSumLeft() { addSumBase(-1,1); // влево (-1) и сложить (1) } function subtractSumRight() { addSumBase(1,-1); // вправо (1) и вычесть (-1) } function subtractSumLeft() { addSumBase(-1,-1); // влево (-1) и вычесть (-1) } function addSumBase(direct, oper) { var ss = SpreadsheetApp.getActive(); // изучаем выделенный диапазон (на любом листе) // в этом диапазоне 1-колонка - Id, 2-я - сумма для добавления на лист назначения var rngSelection = ss.getActiveRange(); var offX = 0; var offY = 0; var delta = rngSelection.getLastColumn() - rngSelection.getColumn(); if (direct > 0) offY = delta; else offX = delta; var valuesX = rngSelection.offset(0, offX, rngSelection.getNumRows(), 1).getValues(); var valuesY = rngSelection.offset(0, offY, 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 и наращиваем для него сумму на листе назначения // ненайденные Id добавляем в таблицу (по желанию пользователя - общему или конкретному) var logString = ''; var flag = 0; var add = false; var answer; for (var row in valuesX) { var sum2add = oper * valuesY[row][0]; var pos = findElem(arr, valuesX[row][0]); if ( pos > 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 { if ( !flag ) { flag = 1; answer = Browser.msgBox('Обнаружен новый неизвестный ID: ' + valuesX[row][0].toString(), 'Добавить все такие ID в таблицу DKP и больше не переспрашивать?', Browser.Buttons.YES_NO); if ( answer === 'no' ) { flag = 2; answer = Browser.msgBox('Обнаружен новый неизвестный ID: ' + valuesX[row][0].toString(), 'НЕ добавлять все такие ID в таблицу DKP и больше не переспрашивать?', Browser.Buttons.YES_NO); if ( answer === 'no' ) { flag = 3; // в этом случаем далее переспрашиваем про каждый } } } switch ( flag ) { case 1: // молчаливо добавляем, не переспрашивая про каждый add = true; break; case 2: // молчаливо НЕ добавляем, не переспрашивая про каждый add = false; break; case 3: // спрашиваем про каждый answer = Browser.msgBox('Обнаружен новый неизвестный ID: ' + valuesX[row][0].toString(), 'Добавить конкретно этот ID в таблицу DKP?', Browser.Buttons.YES_NO); if ( answer === 'yes' ) add = true; else add = false; break; } if ( add ) { // добавляем новую строку sheet.appendRow([null, sum2add, valuesX[row][0].toString()]); logString += 'Добавлено новое значение ' + valuesX[row][0].toString() + ' с суммой ' + sum2add +'\\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); }