रंग स्वरूपण के साथ सेल संदर्भ


16

क्या Google शीट में किसी सेल का संदर्भ देना संभव है, ताकि वह सेल जहां प्रदर्शित हो, वह उसी टेक्स्ट और सेल कलर फॉर्मेटिंग का उपयोग करके भी प्रदर्शित हो?

=A1

केवल सेल के मान को संदर्भित करेगा। लेकिन अगर उस विशेष सेल में लाल पृष्ठभूमि और सफेद पाठ है तो मैं चाहूंगा कि उसकी भी नकल की जाए।

मैं स्क्रिप्ट्स के बजाय मौजूदा फॉर्मूला समाधानों की ओर झुक रहा हूं। यदि लागू हो।


यह साइट केवल वेब एप्लिकेशन के लिए है। Microsoft Excel इसका हिस्सा नहीं है। इसके अलावा, एक्सेल VBA का उपयोग करता है और Google स्प्रेडशीट इस प्रकार के समाधानों के लिए Google Apps स्क्रिप्ट का उपयोग करता है। कृपया अपना प्रश्न संपादित करें या फिर SU पर पूछें।
जैकब जान तुइस्ट्रा

@JacobJanTuinstra: मैं अपने पहले से मौजूद कुछ फार्मूले का उपयोग कर रहा था। और चूंकि Google स्प्रैडशीट ने एक्सेल में मौजूद कई फॉर्मूलों को कवर किया है इसलिए मैंने इसे टैग के रूप में भी जोड़ा है। लेकिन अन्यथा मुझे पता है कि यह वेब ऐप्स के बारे में है। मैंने एक्सेल के साथ टैग किए गए कई सवालों को देखा है, इसलिए मेरा टैग। लेकिन धन्यवाद। भविष्य में इसे नहीं जोड़ेंगे।
रॉबर्ट कोरिटनिक

1
रॉबर्ट, Google स्प्रेडशीट और माइक्रोसॉफ्ट एक्सेल (2010) के बीच कई अंतर हैं। देखें जवाब मैंने दिया: webapps.stackexchange.com/a/44719/29140
जैकब जान तुइस्ट्रा

1
@JacobJanTuinstra: तो मेरे कई लोग उन 85% का जिक्र कर रहे हैं। यह साबित करता है कि यह एक्सेल के अधिकांश फॉर्मूला को कवर करता है। :) और लिंक पोस्ट करने के लिए धन्यवाद। महान अंतर्दृष्टि।
रॉबर्ट कोरिटनिक

जवाबों:


8

Google स्प्रेडशीट के लिए, यह एक स्क्रिप्ट लिखकर संभव है:

function copyValuesAndFormatting() {
    var sheet = SpreadsheetApp.getActiveSpreadsheet();

    var fromRange = sheet.getRange("A2:A");
    var toRange = sheet.getRange("B2:B");
    var values = fromRange.getValues();
    var fontColors = fromRange.getFontColors();
    var backgrounds = fromRange.getBackgrounds();
    var fonts = fromRange.getFontFamilies();
    var fontWeights = fromRange.getFontWeights();
    var fontStyles = fromRange.getFontStyles();

    toRange.setBackgrounds(backgrounds);
    toRange.setFontColors(fontColors);
    toRange.setValues(values);
    toRange.setFontFamilies(fonts);
    toRange.setFontWeights(fontWeights);
    toRange.setFontStyles(fontStyles);
}

स्क्रिप्ट फ़ंक्शन के लिए ट्रिगर जोड़ें , ताकि यह प्रत्येक स्प्रेडशीट संशोधन पर चले।

मैंने यहां एक नमूना स्प्रेडशीट बनाई है । इसे अपने स्वयं के खाते में कॉपी करने के लिए स्वतंत्र महसूस करें, और इसके साथ प्रयोग करना शुरू करें।


मैंने इसे अपने प्रश्न में स्पष्ट रूप से नहीं बताया था, लेकिन मैं मौजूदा फॉर्मूले की ओर देख रहा था और लिपियों के बारे में नहीं। यदि इस कार्य को करने के लिए कोई सूत्र संयोजन नहीं है, तो आपकी स्क्रिप्ट बहुत बेहतर होगी यदि इसका उपयोग एक सूत्र के रूप में किया जाता है, जैसे fullCellRef(cellReference)कि इसका उपयोग =fullCellRef(A1)उदाहरण के लिए किया जा सकता है
रॉबर्ट कोरिटनिक

ओह समझा। लेकिन मुझे नहीं लगता (अगर मैं गलत हूं तो मुझे सुधारें) कोई भी फॉर्मूला है जो फॉर्मेटिंग को निर्दिष्ट करता है।
विदर्भ एस। रामदल

अगर मैं निश्चित रूप से जानता हूं तो मेरा सवाल है तो मैं आपको सही करूंगा। :) लेकिन अन्यथा। मुझे संदेह है कि वहाँ कोई नहीं है। इसलिए यदि आप अपनी स्क्रिप्ट को एक सेल सूत्र के रूप में उपयोग करने के लिए फिर से लिखते हैं तो मैं आपके उत्तर को स्वीकार करूंगा क्योंकि यह हाथ में सुविधाओं के लिए सबसे अच्छा संभव समाधान होगा।
रॉबर्ट कोरिटनिक

1
हम्म, मैं वर्तमान में नहीं जानता कि एक सेल सूत्र फ़ंक्शन उस सेल का संदर्भ कैसे दे सकता है जिसका उपयोग किया जाता है, जो स्वरूपण सेट करने के लिए आवश्यक है। मैं कुछ शोध करूँगा।
विदर्भ एस। रामदल

नहीं, माफ करना, यह असंभव लगता है। एक सूत्र फ़ंक्शन में सेल फ़ॉर्मेटिंग सेट करने की पहुंच नहीं होती है। इसलिए मुझे आपको ट्रिगर विकल्प के साथ छोड़ना होगा।
विदर्भ एस। रामदल

5

आधार के रूप में विदर्भ और जैकब के उत्तरों का उपयोग करते हुए मैंने निम्नलिखित समाधान बनाया है जो आपको लिखने में सक्षम होगा = 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;
}

टॉम की स्क्रिप्ट के लिए लाइन 52 और 53 पर एक त्रुटि है। क्या कोई इसे ठीक से निष्पादित करने में मदद कर सकता है।

@SwapnilGosavi - मैंने अभी अतिरिक्त प्रारूपों को शामिल करने के लिए कोड को अपडेट किया है, और यह सही ढंग से चलने लगता है। मुझे बताएं कि क्या आपके पास अभी भी मुद्दे हैं
टॉम हॉरवुड

यह बहुत बढ़िया है। हालाँकि, जैसा कि मैंने स्रोत कोड पढ़ा है, यह टैब पर काम नहीं करेगा, सही है?
जेड

@ जेड - नहीं - यह टैब में काम नहीं करेगा। यह संभवतः ऐसा करने के लिए बनाया जा सकता है, हालांकि मैंने वास्तव में इस पर ध्यान नहीं दिया है।
टॉम होरवुड

3

यह वह सूत्र है जो आप प्राप्त कर सकते हैं, सूत्र भावना होने में।

कोड

function onEdit(e) {
  var sh = e.source.getActiveSheet();
  var aCell = sh.getActiveCell(), value = aCell.getValue();

  // get formatting
  var fontColor = aCell.getFontColor();
  var background = aCell.getBackground();
  var font = aCell .getFontFamily();
  var fontWeight = aCell.getFontWeight();
  var fontStyle = aCell.getFontStyle();
  var target = Browser.inputBox('Give column number, relative to active cell', 
    Browser.Buttons.OK);
  var tCell = aCell.offset(0,parseInt(target));

  // set formatting
  tCell.setBackground(background).setFontColor(fontColor).setFontFamily(font)
    .setFontWeight(fontWeight).setFontStyle(fontStyle).setValue(value);
}

व्याख्या की

संपादित करने पर, एक संदेश बॉक्स दिखाई देता है और इनपुट मूल्य के लिए पूछता है (माइनस की अनुमति है)। तब प्रारूपण (मूल्य शामिल), जैसा कि विदर ने पहले से ही प्रस्तुत किया है, लागू किया जाता है।

उदाहरण

कॉपी की गई विडार की फाइल: सेल फॉर्मेटिंग


ठंडा! शायद आप 'ट्रिगर ऑन', 'एडिट ऑन' के बजाय अपने ट्रिगर को रजिस्टर कर सकते हैं। इस प्रकार, प्रारूप केवल परिवर्तन के रूप में अच्छी तरह से प्रचार करेगा।
विदर्भ एस। रामदल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.