range.isPartOfMerge()
看來.isPartOfMerge()
方法was implemented(2016年9月11日)。
所以,你可以檢查的範圍被合併爲這樣:
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());
}
文檔https://developers.google.com/apps-script/reference/spreadsheet/range#ispartofmerge
OLD APPROACH
在這裏張貼的另一種方法,我更喜歡比接受的答案。
如果您嘗試使用GAS將值存儲在合併範圍的單元格中,但第一個單元格除外,它將不會存儲它。
因此,我們可以利用這一點,並試圖保存價值,並檢查它是否被儲存,使用類似這樣的一個功能:
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
}
我已經進行了一系列的快速測試,它返回true
/false
據此,但有一個限制,我沒有時間涵蓋: 如果你有一個合併範圍像"A1:F1"
,你檢查的範圍"A1:G1"
(這樣,一個多列),它將返回true
,甚至如果G1不是合併範圍的一部分 - 因爲它僅使用第一個綁定行/列作爲引用來檢查下一列。
好找。 ...我猜這可以用新的樣式表而不是舊式樣。由於問題中的代碼已經檢查了這個想法,並顯示它在舊樣式表中失敗,但是我沒有使用新樣式表進行測試。 – eddyparkinson