range.isPartOfMerge()
Có vẻ như .isPartOfMerge()
phương pháp was implemented (11 tháng 9 năm 2016).
Vì vậy, bạn có thể kiểm tra nếu một phạm vi được sáp nhập như vậy:
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());
}
Documentshttps://developers.google.com/apps-script/reference/spreadsheet/range#ispartofmerge
OLD TIẾP CẬN
viết bài ở đây một cách tiếp cận mà tôi thích hơn hơn câu trả lời được chấp nhận.
Nếu bạn cố gắng sử dụng GAS để lưu trữ giá trị trong ô của phạm vi được hợp nhất, ngoại trừ ô đầu tiên, nó sẽ không lưu trữ.
Như vậy, chúng ta có thể khai thác này và cố gắng để lưu trữ các giá trị và kiểm tra xem nó đã được lưu trữ, sử dụng một chức năng tương tự như này:
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
}
Tôi đã chạy một loạt các bài kiểm tra nhanh chóng và nó trả lại true
/false
cho phù hợp, nhưng có giới hạn rằng tôi không có thời gian để bao gồm: Nếu bạn có phạm vi hợp nhất như "A1:F1"
và bạn đã kiểm tra phạm vi "A1:G1"
(do đó, một cột nữa), nó sẽ trả về true
, thậm chí nếu G1 không phải là một phần của phạm vi hợp nhất - bởi vì nó chỉ kiểm tra cột tiếp theo sử dụng như tham chiếu hàng/cột bị ràng buộc đầu tiên.
Tìm tốt. ... Tôi đoán nó hoạt động với những tấm phong cách mới chứ không phải kiểu cũ. Vì mã trong câu hỏi đã kiểm tra ý tưởng này và cho thấy nó không thành công với bảng định kiểu cũ, nhưng tôi chưa thử nghiệm nó với các tờ định kiểu mới. – eddyparkinson