2016-06-22 11 views
0

Ich bin ein bisschen festgefahren mit meinem Google Apps-Skript beabsichtigt, eine Summe von Zellen zu berechnen, die sind durchgestrichen.Summe Zellen, wenn sie nicht durchgestrichen sind

Hier ist seine Quelle:

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; 
} 

Hier ist die Formel: =SumIfNotStrikethrough("J2").

Ich habe zwei Fragen hier: Um diese Formel zu verwenden, wie zum Beispiel SumIfNotStrikethrough(J2) statt SumIfNotStrikethrough("J2")

  1. Wie das Google Apps Script hinzufügen? Zitate sind so lästig in Bezug auf die Änderung seiner Bereich manuell nach der Formel auf andere Zellen Skalierung :-(Was im Quellcode geändert werden sollte

  2. Als ich dieses Skript ich mit folgendem Fehler konfrontiert:.?

  3. ?

Range not found (line 9, file "SumIfNotStrikethrough"

So, wie kann ich es beheben

UPD № 1. Hier ist ein Beispiel mit einer String-Referenz, aber es zählt nur die Anzahl der Zellen:

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. Leider unterscheidet sich diese Frage von meiner vorherigen Frage "Summenzellen, wenn sie nicht fett sind". Ich habe jeweils versucht, das Skript zu ändern, aber es hat nicht funktioniert. Ja, es fasst Zellen aber es fasst alle Zellen mit Durchschlagen und ohne :-(

Hier ist, was ich geändert:.

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; 
} 

Danke für alle Ihre Versuche, mir zu helfen, in vorrücken

+0

Ich gebe ein Beispiel in der Post-Update, aber es zählt nur die Anzahl der Zellen, nicht eine Summe davon. – RLearnsR

+0

Mögliches Duplikat von [Summenzellen, wenn sie nicht fett sind] (http://stackoverflow.com/questions/37964794/sum-cells-if-they-are-not-bold) –

+0

Es gibt keinen konzeptionellen Unterschied zwischen diesen beiden Fragen du hast geposted. –

Antwort

0

ich die vorgeschlagene Antwort mit getFontLines() geändert haben vielmehr, dass 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; 
} 

Hier die Formel, um es zu verwenden: =SumIfNotStrikethrough1(A2:B3).

Jetzt scheint das in seinem einmaligen Gebrauch richtig zu funktionieren.