2016-04-01 11 views
3

みなさんこんにちは!Google App Script。 Range1がRange2と交差するかどうか確認してください

GoogleシートスクリプトでVBAのintersectと似た機能をご希望です。これを行うにはいい方法がありますか?この関数は返す必要があります。

  • RangeIntersect(R1, R2) = true R1はR2

とは共通のセルを持っていない場合はR1がR2、

  • RangeIntersect(R1, R2) = falseと共通の細胞を持っている場合は、事前にありがとうございます。

    スピードテスト

    は、私は、関数ができるだけ速くとしてを仕事をしたいです。これは、onEditのループ内で使用されるためです。このスクリプトで、テスト提供機能のような場合:

    function speedtest() { 
        var sheet;  
        sheet = SpreadsheetApp.getActiveSheet();  
        var rr1 = ['A1:C16', 'B2:B88', 'D1:D8', 'E1:E17', 'A18:B51', 'A13:A14', 'A17:C17']; 
    
        var r1, r2; 
    
        r1 = sheet.getRange(rr1[0]);  
        var rr2 = []; 
    
        // define some ranges 
        for (var x = 0; x < 30; x++) { 
        for (var i = 0; i < rr1.length; i++) { 
        r2 = sheet.getRange(rr1[i]); 
        rr2.push(r2); 
        } 
        } 
    
        var C; 
    
        var start, end, time; 
        // timer start  
    
        for (var t = 0; t < 10; t++) { 
         start = new Date().getTime(); 
    
         for (var f = 0; f < rr2.length; f++) { 
          C = RangeIntersect(r1, rr2[f]);    
         } 
    
         end = new Date().getTime(); 
         time = end - start; 
         Logger.log('Execution time = ' + time);  
    
        }    
    } 
    
  • +0

    https://stackoverflow.com/questions/306316/determine-if-two-rectangles-overlap-eachの重複を-other –

    答えて

    3

    function RangeIntersect(R1, R2) { 
    
        var LR1 = R1.getLastRow(); 
        var Ro2 = R2.getRow(); 
        if (LR1 < Ro2) return false; 
    
    
        var LR2 = R2.getLastRow(); 
        var Ro1 = R1.getRow(); 
        if (LR2 < Ro1) return false; 
    
        var LC1 = R1.getLastColumn(); 
        var C2 = R2.getColumn(); 
        if (LC1 < C2) return false; 
    
        var LC2 = R2.getLastColumn(); 
        var C1 = R1.getColumn(); 
        if (LC2 < C1) return false; 
    
        return true; 
    
    } 
    

    このスクリプトは、2つの範囲が交差しないときに毎回返すため、〜1.4倍高速です。

    +0

    うまくやった!私は範囲オブジェクトのgetLastColumn/Rowメソッドを認識していませんでした。 –

    6

    まず、あなたの範囲を取得する必要があります座標:

    function Coordinates (range) { 
        var self = this 
        ; 
        self.x1 = range.getColumn(); 
        self.y1 = range.getRow(); 
        self.x2 = range.getLastColumn(); 
        self.y2 = range.getLastRow(); 
    } 
    

    第二に、あなたは、列の境界と行の境界かどうかを知る必要があります重複:

    function RangeIntersect (R1, R2) { 
    
        R1 = new Coordinates (R1); 
        R2 = new Coordinates (R2); 
    
        return (Overlaps(R1.x1, R1.x2, R2.x1, R2.x2) && Overlaps(R1.y1, R1.y2, R2.y1, R2.y2)); 
    } 
    
    :2つの範囲を比較する

    function Overlaps (a, b, c, d) { 
        return (a >= c && a <= d) || (b >= c && b <= d) || (c >= a && c <= b) || (d >= a && d <= b); 
    } 
    

    あなたの要求された機能

    function test() { 
        var sheet, r1, r2, r3 
        ; 
        sheet = SpreadsheetApp.getActiveSheet(); 
        r1 = sheet.getRange(1, 1, 2, 2); 
        r2 = sheet.getRange(2, 2, 2, 2); 
        r3 = sheet.getRange(4, 4); 
    
        Logger.log("%s %s overlap %s", r1.getA1Notation(), (RangeIntersect(r1, r2) ? "does" : "does not"), r2.getA1Notation()); 
        Logger.log("%s %s overlap %s", r2.getA1Notation(), (RangeIntersect(r2, r3) ? "does" : "does not"), r3.getA1Notation()); 
        Logger.log("%s %s overlap %s", r1.getA1Notation(), (RangeIntersect(r1, r3) ? "does" : "does not"), r3.getA1Notation()); 
    
        return; 
    } 
    

    これはただの迅速な解決であることに注意してください:

    そして、ここでは簡単なテストです。また、getActiveRangeには、非表示またはフィルタリングによって隠された行と列が含まれ、それ以外の場合は選択範囲に含まれることに注意してください。

    を追加しました2016年5月4日は

    単一のリターン(私は、単一の出口点を好む)とマックスの迅速ソリューションの短縮版:私は私の独自のバージョンを作った

    function RangeIntersect (R1, R2) { 
        return (R1.getLastRow() >= R2.getRow()) && (R2.getLastRow() >= R1.getRow()) && (R1.getLastColumn() >= R2.getColumn()) && (R2.getLastColumn() >= R1.getColumn()); 
    } 
    
    2

    あなたが交差点を表す範囲をしたい場合は、次のコードを使用することができます:

    function getIntersection(range1, range2) { 
        if (range1.getSheet().getSheetId() != range2.getSheet().getSheetId()) { 
        return null; 
        } 
        var sheet = range1.getSheet(); 
        var startRow = Math.max(range1.getRow(), range2.getRow()); 
        var endRow = Math.min(range1.getLastRow(), range2.getLastRow()); 
        var startColumn = Math.max(range1.getColumn(), range2.getColumn()); 
        var endColumn = Math.min(range1.getLastColumn(), range2.getLastColumn()); 
        if (startRow > endRow || startColumn > endColumn) { 
        return null; 
        } 
        return sheet.getRange(startRow, startColumn, endRow - startRow + 1, endColumn - startColumn + 1); 
    } 
    
    関連する問題