2016-06-22 3 views
0

Я немного застрял со своим скриптом Google Apps, предназначенным для вычисления суммы ячеек, которые являются не strikethrough.Суммировать ячейки, если они не зачеркнуты

Вот его источник:

function SumIfNotStrikethrough(rangeA1Notation) 
{ 
    var sheet = SpreadsheetApp.getActiveSpreadsheet(); 
    var mysheet = sheet.getActiveSheet(); 

    var dataRange = mysheet.getDataRange(); 
    var mydatarange = mysheet.getRange(rangeA1Notation); 
    var numRows = mydatarange.getLastRow(); 
    var rowindex = mydatarange.getRowIndex(); 
    var columnindex = mydatarange.getColumnIndex(); 

    var total =0; 

    for(i=rowindex;i<=numRows;i++) 
    { 
    if(dataRange.offset(i-1, columnindex-1, 1, 1).isBlank() != true && dataRange.offset(i-1, columnindex-1, 1, 1).getFontLine() != "line-through") 
    { 
     var temp = dataRange.offset(i-1, columnindex-1, 1, 1).getValue(); 
     total = total + temp; 
    }  
    } 

    return total; 
} 

Вот его формула: =SumIfNotStrikethrough("J2").

У меня есть два вопроса:

  1. Как добавить скрипт Google Apps, чтобы использовать эту формулу, как, например, SumIfNotStrikethrough(J2), а не SumIfNotStrikethrough("J2")? Котировки настолько раздражающие с точкой зрения изменения его диапазона вручную после масштабирования формулы на других ячейках :-(Что нужно изменить в исходном коде

  2. Когда я запускаю этот скрипт я сталкиваюсь с следующей ошибкой:.?

  3. ?

Range not found (line 9, file "SumIfNotStrikethrough"

Таким образом, как я могу это исправить

UPD № 1. Вот пример со ссылкой строки, но он считает только количество клеток:

function countStrike(range) { 
    var count = 0; 
     SpreadsheetApp.getActiveSheet() 
      .getRange(range) 
      .getFontLines() 
     .reduce(function (a, b) { 
      return a.concat(b); 
     }) 
     .forEach(function (el) { 
      if (el === "line-through") { 
       count++ 
      } 
     }); 
    return count; 
} 

UPD № 2. К сожалению, этот вопрос отличается от моего предыдущего вопроса «Суммировать ячейки, если они не выделены жирным шрифтом». Я, соответственно, попытался изменить скрипт, но он не сработал. Да, это подводит клетку но суммирует все клетки с зачеркнут и без :-(

Вот что я изменилась.

function SumIfNotStrikethrough(){ 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var formula = SpreadsheetApp.getActiveRange().getFormula(); 
    var args = formula.match(/=\w+\((.*)\)/i)[1].split("!"); 
    try { 
    if (args.length == 1) { 
     var range = sheet.getRange(args[0]); 
    } 
    else { 
     sheet = ss.getSheetByName(args[0].replace(/'/g, '')); 
     range = sheet.getRange(args[1]); 
    } 
    } 
    catch(e) { 
    throw new Error(args.join("!") + " is not a valid range"); 
    } 
    var weights = range.getFontLine(); 
    var numbers = range.getValues(); 
    var x = 0; 
    for (var i = 0; i < numbers.length; i++) { 
    for (var j = 0; j < numbers[0].length; j++) { 
     if (weights[i][j] != "line-through" && typeof numbers[i][j] == "number") { 
     x += numbers[i][j]; 
     } 
    } 
    } 
    return x; 
} 

Спасибо за все ваши попытки помочь мне заранее

+0

Я разместил пример в обновлении сообщения, но он подсчитывает количество ячеек, а не сумму. – RLearnsR

+0

Возможный дубликат [Суммировать ячейки, если они не выделены жирным шрифтом] (http://stackoverflow.com/questions/37964794/sum-cells-if-they-are-not-bold) –

+0

Между этими двумя вопросами нет принципиальной разницы вы отправили. –

ответ

0

Я изменил предложенный ответ с getFontLines(), а что getFontLine():

function SumIfNotStrikethrough1(){ 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var formula = SpreadsheetApp.getActiveRange().getFormula(); 
    var args = formula.match(/=\w+\((.*)\)/i)[1].split("!"); 
    try { 
    if (args.length == 1) { 
     var range = sheet.getRange(args[0]); 
    } 
    else { 
     sheet = ss.getSheetByName(args[0].replace(/'/g, '')); 
     range = sheet.getRange(args[1]); 
    } 
    } 
    catch(e) { 
    throw new Error(args.join("!") + " is not a valid range"); 
    } 
    var lines = range.getFontLines(); 
    var numbers = range.getValues(); 
    var x = 0; 
    for (var i = 0; i < numbers.length; i++) { 
    for (var j = 0; j < numbers[0].length; j++) { 
     if (lines[i][j] != "line-through" && typeof numbers[i][j] == "number") { 
     x += numbers[i][j]; 
     } 
    } 
    } 
    return x; 
} 

Вот формулу для использования: =SumIfNotStrikethrough1(A2:B3).

Теперь кажется, что он работает правильно в своем единственном использовании.

Смежные вопросы