edd*_*son 9 google-sheets google-apps-script
在Google文档电子表格中.如果单元格A1和A2合并,有没有办法确认它们是合并的,使用谷歌应用程序脚本?
GAS中有一个合并功能https://developers.google.com/apps-script/class_range#merge
但是没有函数或示例显示如何检查单元格是否合并.
getValues等只返回一个空字符串.例如,这不起作用.
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();
}
Run Code Online (Sandbox Code Playgroud)
range.isPartOfMerge()
该.isPartOfMerge()方法似乎已实施(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());
}
Run Code Online (Sandbox Code Playgroud)
文档 https://developers.google.com/apps-script/reference/spreadsheet/range#ispartofmerge
旧方法
在这里发布另一种我比接受的答案更喜欢的方法。
如果您尝试使用 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
}
Run Code Online (Sandbox Code Playgroud)
我已经运行了一系列快速测试并相应地返回了true/ false,但是有一个我没有时间涵盖的限制:如果您有一个合并范围,"A1:F1"并且您检查了该范围"A1:G1"(因此,再增加一列),true即使 G1 不是合并范围的一部分,它也会返回- 因为它只检查下一列使用第一个绑定行/列作为参考。
是的,现在你可以isPartOfMerge用来检查了。
对于任何想要获得合并单元格值的人:
var value = (cell.isPartOfMerge() ? cell.getMergedRanges()[0].getCell(1,1) : cell).getValue();
Run Code Online (Sandbox Code Playgroud)
希望有帮助。