在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(); }In a Google docs spreadsheet. If cells A1 & A2 are merged, is there a way to confirm they are merged, using google apps script?
There is a merge function in GAS https://developers.google.com/apps-script/class_range#merge
But there is no function or example that shows how to check if cells are merged.
getValues etc just returns an empty string for the cell. e.g. this does not work.
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(); }最满意答案
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()); }Google文档 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 }我已经运行了一系列快速测试,并且相应地返回了true / false ,但是我没有时间来覆盖这个限制:如果您有像"A1:F1"这样的合并范围,并且您检查了范围"A1:G1" (所以,多一列),即使G1不是合并范围的一部分,它也会返回true ,因为它只检查下一列作为引用第一个绑定行/列。
range.isPartOfMerge()
It seems the .isPartOfMerge() method was implemented (11 sept 2016).
So you can check if a range is merged as such:
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()); }Docs https://developers.google.com/apps-script/reference/spreadsheet/range#ispartofmerge
OLD APPROACH
Posting here another approach that I like more than the accepted answer.
If you try to use GAS to store a value in a cell of a merged range, except the first cell, it will not store it.
As such, we can exploit this and attempt to store the value and check if it was stored, using a function similar to this one:
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 }I've ran a series of quick tests and it returned true/false accordingly, but there is a limitation that I didn't have time to cover: If you had a merged range like "A1:F1" and you checked the range "A1:G1" (so, one more column), it will return true, even if G1 is not part of the merged range - because it checks only the next column using as reference the first bound row/column.
更多推荐
发布评论