2016-06-22 100 views
0

でないセルの合計を計算する目的のGoogle Appsスクリプトでちょっとスタックされています取り消し線です。ここ取り消し線がない場合はセルを合計します

は、そのソースである:ここ

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")

私はここで二つの質問があります。例えば、SumIfNotStrikethrough(J2)いうよりSumIfNotStrikethrough("J2")、としてこの数式を使用するためにGoogle Appsのスクリプトを追加する方法

  1. を? ?

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

はで私を助けるためにすべてのあなたの試みをありがとう進める私はgetFontLines()むしろgetFontLine()ことを示唆した答えを変更した

+0

私はポストアップデートで例を挙げましたが、その数だけではなく、セルの数を数えます。 – RLearnsR

+0

[太字でない場合はセルの合計]の複製が可能です(http://stackoverflow.com/questions/37964794/sum-cells-if-the-are-not-bold) –

+0

これらの2つの質問の間に概念的な違いはありませんあなたは投稿しました。 –

答えて

0

:!

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)

これは、1回の使用で正しく機能しているようです。

関連する問題