आधार के रूप में विदर्भ और जैकब के उत्तरों का उपयोग करते हुए मैंने निम्नलिखित समाधान बनाया है जो आपको लिखने में सक्षम होगा = fullCellRef (A1) जो A1 से मूल्य और प्रारूप की प्रतिलिपि बनाएगा।
एक मामूली दुष्प्रभाव यह है कि यदि आप इस फॉर्मूले के साथ सेल को ड्रैग-कॉपी करते हैं, तो नई सेल शुरू में मूल सेल के फॉर्मेटिंग की नकल करेंगे (जैसा कि सामान्य है), लेकिन फिर एक छोटे से ठहराव के बाद संदर्भित स्वरूपण पर स्विच हो जाएगा।
यहाँ नमूना शीट ।
/**
* 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;
}