2012-06-14 11 views
7

in einer Google Docs-Tabelle zusammengeführt werden. Wenn Zellen A1 & A2 zusammengeführt werden, gibt es einen Weg zu bestätigen, dass sie zusammengeführt werden, mit Google Apps-Skript?Woher weiß ich, ob Tabellenkalkulationsfelder mithilfe des Google Apps-Skripts

Es gibt eine Merge-Funktion in GAS https://developers.google.com/apps-script/class_range#merge

Aber es gibt keine Funktion oder ein Beispiel, das zeigt, wie wenn Zellen verschmolzen sind zu überprüfen.

getValues ​​usw. gibt nur eine leere Zeichenfolge für die Zelle zurück. z.B. Diese funktioniert nicht.

function testMerge() { 

    var spreadsheet = SpreadsheetApp.openById('Z3ppTjxNUE........'); 
    var sheet = spreadsheet.getSheets()[0]; 
    var range = sheet.getRange("A3:A4"); 
    var values = range.getValues(); 
    var formulas = range.getFormulasR1C1(); 
    var formulasA1 = range.getFormulas(); 

    range = sheet.getRange("A4"); 
    range.setValue("a"); 

    range = sheet.getRange("A3:A4"); 
    var values2 = range.getValues(); 
    var formulas2 = range.getFormulasR1C1(); 
    var formulasA12 = range.getFormulas(); 


    var count = range.getHeight(); 


} 

Antwort

2

range.isPartOfMerge()

Es scheint die .isPartOfMerge() Methode was implemented (11. September 2016).

Sie können also überprüfen, ob ein Bereich als solche zusammengeführt wird:

function testMerge() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName("Sheet1"); 
    var range = sheet.getRange(1,1,2); // example for cells A1 and A2 
    Logger.log(range.isPartOfMerge()); 
} 

Docshttps://developers.google.com/apps-script/reference/spreadsheet/range#ispartofmerge


OLD ANSATZ

hier Posting einen anderen Ansatz, den ich mag mehr als die angenommene Antwort.

Wenn Sie versuchen, GAS zu verwenden, um einen Wert in einer Zelle eines zusammengeführten Bereichs außer der ersten Zelle zu speichern, speichert es es nicht.

Als solche können wir dies nutzen und versuchen, den Wert zu speichern und überprüfen, ob es gespeichert wurde, unter Verwendung einer Funktion ähnlich wie diese:

function isMerged(range){ 
    try { 
    range.getDataSourceUrl() 
    } catch (err) { 
    throw "isMerged function only works with valid GAS Range objects" 
    } 
    var sheet = range.getSheet(); 
    var rangeData = range.getValues(); 

    var testValue = "testing merge"; 

    if (rangeData.length == 1 && rangeData[0].length == 1) return false; // we have a single cell. Can't possible be merged :) 

    if (rangeData.length == 1) { 
    // We have a single row. Which means we're testing a row with multiple columns 
    var mainCell=range.getA1Notation().split(":")[0]; 
    var rowNumber= sheet.getRange(mainCell).getRow(); 
    var nextColNumber = sheet.getRange(mainCell).getColumn()+1; 
    var row = rangeData[0]; 
    var oldValue = row[1]; // for testing purposes, we're chosing the next possible column 

    sheet.getRange(rowNumber,nextColNumber).setValue(testValue); 
    if (sheet.getRange(rowNumber,nextColNumber).getValue() !== testValue) { 
     return true; 
    } else { 
     sheet.getRange(rowNumber,nextColNumber).setValue(oldValue); 
     return false; 
    }; 
    } else if (rangeData[0].length == 1) { 
    // We have multiple rows and a single column. 
    var mainCell=range.getA1Notation().split(":")[0]; 
    var nextRowNumber= sheet.getRange(mainCell).getRow()+1; 
    var colNumber = sheet.getRange(mainCell).getColumn(); 
    var oldValue = rangeData[1][0]; // for testing purposes, we're chosing the next possible row 

    sheet.getRange(nextRowNumber,colNumber).setValue(testValue); 
    if (sheet.getRange(nextRowNumber,colNumber).getValue() !== testValue) { 
     return true; 
    } else { 
     sheet.getRange(nextRowNumber,colNumber).setValue(oldValue); 
     return false; 
    }; 
    } else { 
    // We have multiple rows and multiple columns 
    var mainCell=range.getA1Notation().split(":")[0]; 
    var nextRowNumber= sheet.getRange(mainCell).getRow()+1; 
    var nextColNumber = sheet.getRange(mainCell).getColumn()+1; 
    var oldValue = rangeData[1][1]; // for testing purposes, we're chosing the next possible row and next possible column 

    sheet.getRange(nextRowNumber,nextColNumber).setValue(testValue); 
    if (sheet.getRange(nextRowNumber,nextColNumber).getValue() !== testValue) { 
     return true; 
    } else { 
     sheet.getRange(nextRowNumber,nextColNumber).setValue(oldValue); 
     return false; 
    }; 
    } 

    // if none of these checks worked, something's fishy. Either way, return false 
    return false 
} 

Ich habe eine Reihe von Schnelltests lief und es zurückgegeben true/false entsprechend, aber es gibt eine Einschränkung, die ich keine Zeit hatte zu decken: Wenn Sie einen Bereich wie "A1:F1" zusammengeführt hatten und Sie den Bereich "A1:G1" (so, eine weitere Spalte) überprüft, wird es true, sogar zurückgeben wenn G1 nicht Teil des zusammengeführten Bereichs ist - weil es nur die nächste Spalte überprüft, wobei als Referenz die erste gebundene Zeile/Spalte verwendet wird.

+0

Gut finden. ... Ich vermute, das funktioniert mit neuen Stylesheets und nicht im alten Stil. Da der Code in der Frage diese Idee bereits überprüft und zeigt, dass er mit dem alten Stylesheet fehlschlägt, habe ich ihn nicht mit neuen Stylesheets getestet. – eddyparkinson

3

Es ist nicht möglich, das zu wissen. Es gibt bereits eine geöffnet, aber es ist ziemlich alt und hat keine Aktivität. Sie sollten es markieren (um Updates und Art der Abstimmung dafür zu verfolgen) und einen Kommentar hinterlassen, um zu sehen, ob Sie etwas Aufmerksamkeit bekommen können.

Aber was ich mache, wenn ich zusammengefügte Zellen versichern muss, sind, wie ich will, dass sie alles auseinander brechen und wieder zusammenführen, nur um sicher zu sein. Natürlich ist das keine Lösung, sondern nur eine Idee, die auch Ihnen gefällt.

+0

Henrique, ich fand am Ende eine Lösung. So markierte es als die richtige Antwort. – eddyparkinson

0

Im HTML-Format herunterladen: Sie können ein Blatt als HTML herunterladen, dieses enthält die verbundenen Zellinformationen. Keine nette Lösung, aber es funktioniert.

Beispiel Download-URL:

docs.google.com/feeds/download/spreadsheets/Export?key=* spreadsheetkey * & exportFor mat = html & gid = 3

wo gid ist die Blatt-GID-Nummer. - signin über Google Drive api erforderlich (siehe google DrEdit Tutorial für Details Fahrt)

+0

Und aus dem HTML können Sie überprüfen, welche Zellen zusammengeführt werden? Irgendein Einblick darauf (z. B. legen sie rowspan)? Ich frage, da das deine ursprüngliche Frage war. –

+0

Ja, das HTML enthält rowspan und colspan für verbundene Zellen. Einfach zu testen, verwenden Sie die URL oben, ändern Sie den Schlüssel und es wird heruntergeladen, wenn Sie angemeldet sind. (Gid ist optional, wählt es das Blatt). – eddyparkinson

0

diese Lösung gefunden, hier gepostet:
https://code.google.com/p/google-apps-script-issues/issues/detail?id=618

Aber funktioniert nur für aktiven Bereich

// This is my function to test the active range is merged or not and return 
// true or false by passing active range to it 
function ismerge() { 
    var spread = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = spread.getActiveSheet(); 
    var last_row = sheet.getActiveRange().getLastRow(); 
    var last_col = sheet.getActiveRange().getLastColumn(); 

    Logger.log("Last row: %s", last_row); 
    var active_row = sheet.getActiveRange().getRow(); 
    var active_col = sheet.getActiveRange().getColumn(); 
    Logger.log("Row: %s", active_row); 
    if ((last_row == active_row) && (last_col == active_col)) { 
    Logger.log("Cell not merged"); 
    return false; 
    } 
    else { 
    Logger.log("Cell merged"); 
    return true; 
    } 
} 
1

Wenn jemand hier eine Arbeit für dieses Problem benötigt, schrieb ich ein kleines Tool, das die meisten der Esel-Arbeit aus dem Erstellen einer Schlüsselwertdatei aller verbundenen Zellen aus exportiertem HTML macht.

Sie können es hier finden: https://github.com/martinhbramwell/CellMergeWorkAround

ich es geschrieben habe, weil ich ein kleines Projekt, das von einer Tabelle zu einem anderen vollständig Klon Bereiche auf der Lage abhängt. Natürlich habe ich meine Stimme hinzugefügt, um das Problem zu beheben.

(Hinweis: Ich hätte dies als Kommentar zur richtigen Antwort hinzugefügt, aber es fehlen die notwendigen Punkte.)

1

Es scheint einen Workaround zu geben, der die Tatsache ausnutzt, dass verbundene Zellen immer einen weißen Hintergrund zurückgeben. Der folgende Code scheint für mich zu funktionieren. Ich werde es schätzen, wenn jemand bestätigen kann.

0

Vielleicht ist es ein bisschen spät Antwort, da ich dieses Problem für neue Version von Google Tabellen nicht sah. Aber ich verwende immer noch alte Tabellenversionen für mein Projekt. Also musste ich es irgendwie herausfinden.

Ich muss das Format der vorherigen Spalte für neue Spalten kopieren. Dies ist Teil des Codes unter:

 // trying to find first column with week day (white background) 
     var background = ''; 
     for(var columnIndex = 3; columnIndex<=columnLetters.length; columnIndex++){ 
     background = sheet.getRange(1, columnIndex).getBackground(); 
     if(background == 'white' || background == ''){ 
      tmpRange = columnLetters[columnIndex]+':'+columnLetters[columnIndex]; 
      Logger.log('tmpRange: '+tmpRange); 
      // workaround to be able to copy format if there is some merged cells 
      try{ 
      Logger.log('try'); 
      // copy format of previous column 
      sheet.getRange(tmpRange).copyTo(
       sheet.getRange('B1'), {formatOnly:true} 
      ); 
      }catch(e) { 
      Logger.log('continue'); 
      continue; 
      } 
      Logger.log('break'); 
      break; 
     } 
     } 

So ist der wichtigste Teil ist hier:

try{ 
    Logger.log('try'); 
    // copy format of previous column 
    sheet.getRange(tmpRange).copyTo(
    sheet.getRange('B1'), {formatOnly:true} 
); 
}catch(e) { 
    Logger.log('continue'); 
    continue; 
} 

Wenn es unmöglich ist, diese Zellen zu kopieren es andere einfach weiter suchen.

Verwandte Themen