Sử dụng câu trả lời của Vidar và Jacob làm cơ sở Tôi đã tạo ra giải pháp sau đây cho phép bạn viết = fullCellRef (A1) sẽ sao chép giá trị và định dạng từ A1.
Một tác dụng phụ nhỏ là nếu bạn kéo sao chép một ô có công thức này, các ô mới ban đầu sẽ sao chép định dạng của ô ban đầu (như bình thường), nhưng sau đó sẽ chuyển sang định dạng được tham chiếu sau một khoảng dừng nhỏ.
Mẫu tờ ở đây .
/**
* Dummy function to be the equivalent of using simple reference,
* but is used to identify which cells to copy format.
* The immediate effect of =fullCellRef(A1) is the same as =A1
*
* @param {string} value The value of the referred cell
* @return {string} The given value
*/
function fullCellRef(value){
return value;
}
/**
* For each cell with the formula eg B2=fullCellRef(A1), the format of
* the referred cell (eg A1) is copied to the calling cell (eg B2)
*/
function copyFormatting() {
var sheet = SpreadsheetApp.getActiveSheet();
var range = sheet.getDataRange();
var offsetRow = range.getRow() - 1;
var offsetCol = range.getColumn() - 1;
var formulas = range.getFormulas();
var formats = {
fontColors: range.getFontColors(),
backgrounds: range.getBackgrounds(),
fonts: range.getFontFamilies(),
fontWeights: range.getFontWeights(),
fontStyles: range.getFontStyles(),
verticalAlignments: range.getVerticalAlignments(),
horizontalAlignments: range.getHorizontalAlignments(),
numberFormats: range.getNumberFormats()
};
var formulaIsUsed = false;
for (var row = 0; row < formulas.length; row ++ ) {
for (var column = 0; column < formulas[row].length; column ++ ) {
var refersTo = findReferenceCells(formulas[row][column]);
if (refersTo){
formulaIsUsed = true;
var refRow = refersTo.row - offsetRow;
var refCol = refersTo.column - offsetCol;
for (var key in formats) {
formats[key][row][column] = formats[key][refRow][refCol];
}
}
}
}
if (formulaIsUsed) {
range.setBackgrounds(formats.backgrounds);
range.setFontColors(formats.fontColors);
range.setFontFamilies(formats.fonts);
range.setFontWeights(formats.fontWeights);
range.setFontStyles(formats.fontStyles);
range.setVerticalAlignments(formats.verticalAlignments);
range.setHorizontalAlignments(formats.horizontalAlignments);
range.setNumberFormats(formats.numberFormats);
}
}
/**
* Returns the 2D array indices to identify the referred cell.
* @param {string} formula The cell formula
* @return {Array.integer} The row and column array indices
*/
function findReferenceCells(formula) {
if (formula === "") {
return false;
}
var refPattern = /^=fullcellref\(([a-z]{1,2})(\d+)\)$/i;
var matches = refPattern.exec(formula.replace(" ", ""));
matches.shift();
if (!matches) {
return false;
}
// convert cell reference to array indices
var column = colToInteger(matches[0]) - 1;
var row = matches[1] - 1;
return {row: row, column: column};
}
/**
* Converts a column name to a column number
* @param {string} columnName eg "A", "BB"
* @return {integer} Between 1 and 256
*/
function colToInteger(columnName){
var nameParts = columnName.toLowerCase().split();
//97 is char code of "a", but we need 1 based indices
var colNum = nameParts.pop().charCodeAt(0) - 96;
if (nameParts.length === 1){
colNum += 26 * (nameParts.pop().charCodeAt(0) - 96);
}
return colNum;
}