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.
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