A1 স্বরলিপি ব্যবহার না করে গুগল অ্যাপস স্ক্রিপ্ট কাস্টম ফাংশনে পাসের পরিধি


10

আমি গুগল অ্যাপস স্ক্রিপ্টে নতুন এবং আমি এমন একটি স্প্রেডশিটের জন্য একটি ফাংশন তৈরি করতে চাই যা ঘরের ব্যাকগ্রাউন্ডের রঙের মতো নির্দিষ্ট মানদণ্ডগুলি পূরণ করার সাথে সাথে সেল মানগুলি পূরণ করে। তদুপরি, আমি অ্যারে হিসাবে পরিসরটি পাস করতে চাই এবং নীচের কারণে A1 স্বরলিপি ব্যবহার না করি।

আমি একটি ফাংশন A1 নোটেশন ব্যবহার করে পাওয়া এখানে । সমস্যাটি হ'ল যখন আমি এটি কোনও নির্দিষ্ট ঘরে রাখি

=sumWhereBackgroundColorIs("white", "A1:A10")

এবং আমি ডান সংলগ্ন কক্ষে মানটি অনুলিপি করলাম ফলাফল আবার হবে

= যোগফলব্যাকগ্রাউন্ড কালারআইএস ("সাদা", "এ 1: এ 10" )

আমি চাই যখন

= যোগফলব্যাকগ্রাউন্ড কালারআইএস ("সাদা", "বি 1: বি 10" )

অন্যথায় আমি সর্বদা ম্যানুয়ালি ইনপুট আর্গুমেন্টটি সংশোধন করেছি এবং আমি এড়াতে চাই যেহেতু আমি এই ফাংশনটি ব্যাপকভাবে ব্যবহার করেছি।

সুতরাং আমি ব্যবহার করে মানগুলির একটি অ্যারে হিসাবে একটি পরিসর পাস করে চেষ্টা করেছি

=sumIfBgColor(#ffffff, A1:A10)


function sumIfBgColor(color, range){
    var x = 0;
    for(var i = 0; i < range.length; i++){
      for(var j = 0; j < range[i].length; j++){

        var cell = getCell();

        if(cell.getBackgroundColor() == color)
          x += parseFloat(range[i][j]);
      }
    }
    return x;
}

তবে আমার কী আছে তা থেকে কীভাবে সেল (যেমন টাইপ রেঞ্জের অবজেক্টটি) পেতে হবে তা আমি জানি না।


কোনও API কল ব্যবহার না করে এটি সম্ভব নয়। যদি এটি হয় তবে আপনার এটি ব্যবহার করা দরকার A1 notation
জ্যাকব জান টুইনস্ট্র

এটি বলতে আমি ঘৃণা করি, তবে আপনি যে স্ক্রিপ্টটি পেয়েছেন তা খুব কার্যকর নয় is কয়েকটি সারিতে, পার্থক্যটি উল্লেখযোগ্য নাও হতে পারে, তবে আপনার যদি আরও সারি থাকে, তবে 100 বলুন, তবে প্রক্রিয়াকরণের সময়টির পার্থক্যটি বিশাল। আমি প্রস্তুত স্ক্রিপ্টটি 30x দ্রুত, কারণ এটিতে কেবল তিনটি এপিআই কল রয়েছে। আপনি যে স্ক্রিপ্টটি পেয়েছেন প্রায় 100 টি সারির জন্য ব্যবহার করে। 300 এপিআই কল। আমার উদাহরণ দেখুন। প্রদত্ত সংখ্যাগুলি হ'ল মিলিসেকেন্ড।
জ্যাকব জানু টিনস্ট্রা

এটি সহায়ক হতে পারে: webapps.stackexchange.com/a/58179/12075
সনমাই

1
= sumWhereBackgroundColorIs ( "সাদা", ADDRESS এর (সারি (ক 1), কলাম (A10), 4) & ":" & ADDRESS এর (সারি (A10), কলাম (A10), 4)) চেষ্টা এটি ব্যবহার
roamer

উত্তর:


8

জ্যাকব-এর অসম্ভবতার দাবিতে আমি এটিকে খণ্ডন করছি ... (তবে উন্নত গতির জন্য ধন্যবাদ)

ব্যবহার:

=sumIfBgColor("#ffffff", A1:A10, COLUMN(A1), ROW(A1))

নিম্নলিখিত ফাংশনগুলির সাথে আপনি যা চান তা করবে।

/**
 * Sums cell values in a range if they have the given background color
 * 
 * @param  {String} color    Hex string of color eg ("#ffffff")
 * @param  {Array.Array} range    Values of the desired range
 * @param  {int} startcol The column of the range
 * @param  {int} startrow The first row of the range
 * 
 * @return {int}          Sum of all cell values matching the condition
 */
function sumIfBgColor(color, range, startcol, startrow){
  // convert from int to ALPHANUMERIC - thanks to 
  // Daniel at http://stackoverflow.com/a/3145054/2828136
  var col_id = String.fromCharCode(64 + startcol);
  var endrow = startrow + range.length - 1
  // build the range string, then get the background colours
  var range_string = col_id + startrow + ":" + col_id + endrow
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var getColors = ss.getRange(range_string).getBackgrounds();

  var x = 0;
  for(var i = 0; i < range.length; i++) {
    for(var j = 0; j < range[0].length; j++) {
      // Sometimes the cell background is eg 'white' rather than '#ffffff'.
      // I don't know why - I think it's a bug.
      // so we remove that inconsistency with colourNameToHex
      // courtesy of Greg at http://stackoverflow.com/a/1573141/2828136
      if(colourNameToHex(getColors[i][j].toString()) == color) {
        x += range[i][j];
      }
    }
  }
  return x;
}

/**
 * Takes a colour string and returns it to a hex string. If a non-matching string is
 * passed, it will return the argument as is - for this situation it means that a
 * hex string can be passed to it and be returned as is. This is not for production.
 * 
 * @param  {string} color    Must be either a colour name or hex string of color eg ("#ffffff")
 * 
 * @return {object|string}          hex string of color eg ("#ffffff") or the argument given.
 */
function colourNameToHex(colour)
{
    var colours = {"aliceblue":"#f0f8ff","antiquewhite":"#faebd7","aqua":"#00ffff","aquamarine":"#7fffd4","azure":"#f0ffff",
    "beige":"#f5f5dc","bisque":"#ffe4c4","black":"#000000","blanchedalmond":"#ffebcd","blue":"#0000ff","blueviolet":"#8a2be2","brown":"#a52a2a","burlywood":"#deb887",
    "cadetblue":"#5f9ea0","chartreuse":"#7fff00","chocolate":"#d2691e","coral":"#ff7f50","cornflowerblue":"#6495ed","cornsilk":"#fff8dc","crimson":"#dc143c","cyan":"#00ffff",
    "darkblue":"#00008b","darkcyan":"#008b8b","darkgoldenrod":"#b8860b","darkgray":"#a9a9a9","darkgreen":"#006400","darkkhaki":"#bdb76b","darkmagenta":"#8b008b","darkolivegreen":"#556b2f",
    "darkorange":"#ff8c00","darkorchid":"#9932cc","darkred":"#8b0000","darksalmon":"#e9967a","darkseagreen":"#8fbc8f","darkslateblue":"#483d8b","darkslategray":"#2f4f4f","darkturquoise":"#00ced1",
    "darkviolet":"#9400d3","deeppink":"#ff1493","deepskyblue":"#00bfff","dimgray":"#696969","dodgerblue":"#1e90ff",
    "firebrick":"#b22222","floralwhite":"#fffaf0","forestgreen":"#228b22","fuchsia":"#ff00ff",
    "gainsboro":"#dcdcdc","ghostwhite":"#f8f8ff","gold":"#ffd700","goldenrod":"#daa520","gray":"#808080","green":"#008000","greenyellow":"#adff2f",
    "honeydew":"#f0fff0","hotpink":"#ff69b4",
    "indianred ":"#cd5c5c","indigo ":"#4b0082","ivory":"#fffff0","khaki":"#f0e68c",
    "lavender":"#e6e6fa","lavenderblush":"#fff0f5","lawngreen":"#7cfc00","lemonchiffon":"#fffacd","lightblue":"#add8e6","lightcoral":"#f08080","lightcyan":"#e0ffff","lightgoldenrodyellow":"#fafad2",
    "lightgrey":"#d3d3d3","lightgreen":"#90ee90","lightpink":"#ffb6c1","lightsalmon":"#ffa07a","lightseagreen":"#20b2aa","lightskyblue":"#87cefa","lightslategray":"#778899","lightsteelblue":"#b0c4de",
    "lightyellow":"#ffffe0","lime":"#00ff00","limegreen":"#32cd32","linen":"#faf0e6",
    "magenta":"#ff00ff","maroon":"#800000","mediumaquamarine":"#66cdaa","mediumblue":"#0000cd","mediumorchid":"#ba55d3","mediumpurple":"#9370d8","mediumseagreen":"#3cb371","mediumslateblue":"#7b68ee",
    "mediumspringgreen":"#00fa9a","mediumturquoise":"#48d1cc","mediumvioletred":"#c71585","midnightblue":"#191970","mintcream":"#f5fffa","mistyrose":"#ffe4e1","moccasin":"#ffe4b5",
    "navajowhite":"#ffdead","navy":"#000080",
    "oldlace":"#fdf5e6","olive":"#808000","olivedrab":"#6b8e23","orange":"#ffa500","orangered":"#ff4500","orchid":"#da70d6",
    "palegoldenrod":"#eee8aa","palegreen":"#98fb98","paleturquoise":"#afeeee","palevioletred":"#d87093","papayawhip":"#ffefd5","peachpuff":"#ffdab9","peru":"#cd853f","pink":"#ffc0cb","plum":"#dda0dd","powderblue":"#b0e0e6","purple":"#800080",
    "red":"#ff0000","rosybrown":"#bc8f8f","royalblue":"#4169e1",
    "saddlebrown":"#8b4513","salmon":"#fa8072","sandybrown":"#f4a460","seagreen":"#2e8b57","seashell":"#fff5ee","sienna":"#a0522d","silver":"#c0c0c0","skyblue":"#87ceeb","slateblue":"#6a5acd","slategray":"#708090","snow":"#fffafa","springgreen":"#00ff7f","steelblue":"#4682b4",
    "tan":"#d2b48c","teal":"#008080","thistle":"#d8bfd8","tomato":"#ff6347","turquoise":"#40e0d0",
    "violet":"#ee82ee",
    "wheat":"#f5deb3","white":"#ffffff","whitesmoke":"#f5f5f5",
    "yellow":"#ffff00","yellowgreen":"#9acd32"};

    if (typeof colours[colour.toLowerCase()] != 'undefined')
        return colours[colour.toLowerCase()];

    return colour;
}

1
এটি চেষ্টা করে দেখুন এটি কার্যকর হয়। ওয়েব অ্যাপ্লিকেশনগুলিতে এই উত্তরটি পাওয়া খুব ভাল।
জ্যাকব জান টুইনস্ট্রা

2
আমি এই জিনিস পরীক্ষা, আপনি জানেন। ;-)
টম হরউড

থ্যাঙ্কস পিটস - কেবল আমার পুরানো উত্তরটি পড়েই ভাবছিলেন এবং ভাবছিলেন যে রঙটি কিছুটা সাহায্য করতে পারে (আমার ধারণা এটি এখনও ঘটবে না)। দুঃখিত নোটপ্যাড শৈলীর উত্তরগুলি পড়তে হবে এমন প্রত্যেকে :-)
টম হরউড

2

তথ্যসূত্র: http://igoogledrive.blogspot.com/2015/11/google-spreadsheet-sum-of-colored-cells.html

কাস্টম ফাংশনে স্ট্রিং হিসাবে প্যারামিটারগুলি পাস করার পরিবর্তে, নিম্নলিখিত স্ক্রিপ্টটি একটি পরিসীমা হিসাবে ইনপুট নেয়:

/**
* @param {string} color String as background color to be searched for in sumRange
* @param {range} sumRange Range to be evaluated
* @return {number}
* @customfunction
*/

function sumColoredCells(color,sumRange) {
  var activeRange = SpreadsheetApp.getActiveRange();
  var activeSheet = activeRange.getSheet();
  var formula = activeRange.getFormula();
  var rangeA1Notation = formula.match(/\,(.*)\)/).pop();
  var range = activeSheet.getRange(rangeA1Notation);
  var bg = range.getBackgrounds();
  var values = range.getValues();
  var total = 0;

  for(var i=0;i<bg.length;i++)
    for(var j=0;j<bg[0].length;j++)
      if( bg[i][j] == color )
        total=total+(values[i][j]*1);
  return total;
};

নিম্নলিখিত স্ক্রিনশটটি দেখুন:

এখানে চিত্র বর্ণনা লিখুন


1

নিম্নলিখিত ছোট স্ক্রিপ্টটি কৌশলটি করবে।

কোড

function sumIfBgColor(color, range){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var getColors = ss.getRange(range).getBackgrounds();
  var getValues = ss.getRange(range).getValues(), x = 0;
  for(var i = 0; i < getValues.length; i++) {
    for(var j = 0; j < getValues[0].length; j++) {
      if(getColors[i][j].toString() == color) {
        x += getValues[i][j];
      }
    }
  }
  return x;
}

ব্যাখ্যা

প্রথমত, সক্রিয় স্প্রেডশিট নির্ধারিত হয়। তারপরে ব্যাপ্তির উপর ভিত্তি করে মান এবং রং উভয়ই আনা হয়। মানগুলি রঙগুলির মাধ্যমে পুনরাবৃত্তি করতে এবং শেষ পর্যন্ত সংমিশ্রণে ব্যবহৃত হবে।

ব্যবহার

এখানে চিত্র বর্ণনা লিখুন

উদাহরণ

আমি আপনার জন্য একটি উদাহরণ ফাইল তৈরি করেছি: ব্যাকগ্রাউন্ডের ভিত্তিতে যোগফল


1
এই ফাংশনটি কাজ করে তবে আপনাকে এ 1 সংকেত দিয়ে কল করতে হবে, অর্থাত্ একটি সেল = SumIfBgColor (#ffffff, "A1: A10") এ লেখার পরে এটি আমার উপরে লেখা প্রয়োজনীয়তার সাথে খাপ খায় না, যেমন কক্ষগুলির মধ্যে সূত্রটি অনুলিপি করে কপি করে প্যাস্ত করতে হবে while আমাকে কন্টেন্টটি ম্যানুয়ালি সম্পাদনা করতে হবে
Ganswer

@ অ্যানগ্যাসওয়ার আপনার প্রশ্নের আমার মন্তব্যে, আমি ইতিমধ্যে উল্লেখ করেছি যে এটি সম্ভব নয়। আপনার কোডটি A1 স্বরলিপি সহ বা এর বাইরে কাজ করা উচিত হয়নি। সুতরাং আমি একটি স্ক্রিপ্ট লিখেছি যে।
জ্যাকব জানু টিনস্ট্রা

দুঃখিত আমি আপনার মন্তব্য পড়তে না। এত খারাপ খবর! সুতরাং কোনও উপায় নেই..আমি আমি A1 স্বরলিপি ব্যবহার করতে পারি না, আমাকে আমার স্প্রেডশিটের লেআউট সম্পূর্ণরূপে পরিবর্তন করতে হবে। ধন্যবাদ
গেঞ্জওয়ার

@ উত্তরসুর্গ যদিও আপনি আমার উত্তরটি দরকারী বলে খুঁজে পেয়েছেন?
জ্যাকব জান টুইনস্ট্রা

1
এটি একটি ভাল বিকল্প তবে আমার ইতিমধ্যে একটি অনুরূপ ফাংশন ছিল যা এ 1 স্বরলিপি সহ কাজ করে। শীর্ষে একটি মন্তব্য সহ আপনার উত্তরটি সংশোধন করে বলুন যে আমি যা অনুসন্ধান করি তা সম্ভব নয়, যাতে আমি আপনার উত্তরটি সমাধান হিসাবে গ্রহণ করতে পারি
Ganswer
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.