2016-06-22 3 views
1

私のGoogle Appsスクリプトは、これらのセルがの太字のの場合にのみ、セルの合計を計算することを目的としています。太字でない場合のセルの合計

=(SumIfNotBold(K2:K100,COLUMN(K2), ROW(K2)))*1

私は三つの主要な懸念を持っている:ここで

function SumIfNotBold(range, startcol, startrow){ // convert from int to ALPHANUMERIC // - thanks to Daniel at http://stackoverflow.com/a/3145054/2828136 var start_col_id = String.fromCharCode(64 + startcol); var end_col_id = String.fromCharCode(64 + startcol + range[0].length -1); var endrow = startrow + range.length - 1 // build the range string, then get the font weights var range_string = start_col_id + startrow + ":" + end_col_id + endrow var ss = SpreadsheetApp.getActiveSpreadsheet(); var getWeights = ss.getRange(range_string).getFontWeights(); var x = 0; var value; for(var i = 0; i < range.length; i++) { for(var j = 0; j < range[0].length; j++) { if(getWeights[i][j].toString() != "bold") { value = range[i][j]; if (!isNaN(value)){ x += value; } } } } return x; 

が式である:ここでは

はソースです、私はトリガーを設定

  1. 編集時にこのスクリプトを起動すると、誤ってn個のGoogle Appsからメール

TypeError: Cannot read property "length" from undefined. (line 7, file "SumIfNotBold")

はこのように、どのように私はそれを修正することができますことを伝えますか?これらの自動的に配信される通知を無視する方法はありますか?

  1. 数式は、他のリストにあるセルの合計を計算しません。たとえば、Bリストに数式を入れてもセルがリストにある場合、このスクリプトは間違った計算を引き出すという点では正しく機能しません。

  2. セルの値が更新されると、式の導出は更新されません。この場合、式自体を更新しています(つまり、「K2:K50」を「K3:K50」に変更して一度戻っていきます)。

このスクリプトの問題を解決してください。非大胆なセルで合計を計算するために新しいセルを使用する方が良い場合は、新しいソリューションを受け入れることができます。

+0

トリガーを「任意の編集でこのスクリプトを起動する」ように設定すると、どの範囲が合計されると思いますか?あなたはどんな範囲を望んでいるのか、どのようにして知っていますか? –

+0

@soup、はい、それは明らかですが、編集するだけで、私が 'SumIfNotBold'の派生をリフレッシュする必要があるため、作成します。私が説明に書いたように、それは自動的に変化しないので、私はトリガを設定しています。あなたはそれをより柔軟にするために書き直すことができますか? – RLearnsR

答えて

0

ここでは、発生させた問題のいくつかを解決するこのスクリプトのバージョンを示します。別のシートを使用している場合は、単に=sumifnotbold(A3:C8)または=sumifnotbold(Sheet2!A3:C8)と呼び出されます。

任意のカスタム関数として、参照先の範囲のエントリが編集されると自動的に再計算されます。 が太字から標準または逆にフォントを変更すると自動的に再計算されません。この場合、その合計の範囲内の空でないセルに対しては、元に戻すことでその機能をすばやく更新することができます。一部の数値を削除してから、削除を元に戻します。

関数のほとんどは、アクティブなセルの数式を解析することによって、渡された範囲への参照を取得します。 注意::これは、この機能が単独で使用されていることを前提にしています。=sumifnotbold(B2:C4)です。 =max(A1, sumifnotbold(B2:C4)のような別の機能では機能しません。

function sumifnotbold(reference) { 
    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'); 
    } 

    // everything above is range extraction from the formula 
    // actual computation begins now 

    var weights = range.getFontWeights(); 
    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] != "bold" && typeof numbers[i][j] == 'number') { 
     x += numbers[i][j]; 
     } 
    } 
    } 
    return x; 
} 
+0

ありがとうございました! – RLearnsR

関連する問題