গুগল স্প্রেডশীটগুলিতে কোনও কাস্টম ফাংশনে কোনও সীমা কীভাবে পাস করবেন?


44

আমি একটি ফাংশন তৈরি করতে চাই যা একটি ব্যাপ্তি লাগে ... এর মতো কিছু:

function myFunction(range) {
  var firstColumn = range.getColumn();
  // loop over the range
}

একটি ঘর এটি ব্যবহার করে রেফারেন্স করবে:

=myFunction(A1:A4)

সমস্যাটি হ'ল যখন আমি এটি করার চেষ্টা করি তখন প্যারামিটারটি মনে হয় এটি কেবল ফাংশনে মানগুলি প্রেরণ করছে। সুতরাং, আমি যেমন রেঞ্জের কোনও পদ্ধতি ব্যবহার করতে পারি না getColumn()। আমি যখন এটি করার চেষ্টা করি তখন এটি নীচের ত্রুটি দেয়:

ত্রুটি: প্রকারের ত্রুটি: 1,2,3 অবজেক্টে ফাংশন গেটকলাম খুঁজে পাওয়া যায় না।

আমি আমার কাস্টম ফাংশনগুলির মধ্যে কেবলমাত্র মানগুলির চেয়ে একটি প্রকৃত পরিসর কীভাবে প্রেরণ করতে পারি?

উত্তর:


22

সুতরাং আমি এর ভাল উত্তরের জন্য দীর্ঘ এবং কঠোর অনুসন্ধান করেছি এবং আমি যা পেয়েছি তা এখানে:

  1. একটি অপরিবর্তিত পরিসীমা প্যারামিটারটি পরিসরের ঘরগুলির মানগুলিতে চলে যায় , পরিসীমাটি নিজেই নয় (জর্জি বর্ণিত হিসাবে) প্রাক্তন: আপনি যখন এটি করেন=myFunction(a1:a2)

  2. আপনার ফাংশনটিতে একটি ব্যাপ্তি ব্যবহার করতে আপনাকে প্রথমে একটি স্ট্রিং (প্রাক্তন =myFunction("a1:a2"):) হিসাবে পরিসীমাটি পাস করতে হবে, তারপরে এটি ফাংশনের অভ্যন্তরে নিম্নলিখিত কোডের সাথে একটি পরিসরে পরিণত করুন:

    Function myFunction(pRange){
      var sheet = SpreadsheetApp.getActiveSpreadsheet();
      var range = sheet.getRange(pRange);
    }
    
  3. পরিশেষে, আপনি যদি কোনও ব্যাপ্তিতে পাস করার সুবিধাগুলি চান (যেমন অন্যান্য কোষের জন্য বুদ্ধিমানের সাথে পরিসীমা রেফারেন্সগুলি অনুলিপি করে) এবং আপনি এটি একটি স্ট্রিং হিসাবে পাস করতে চান তবে আপনাকে একটি ডিফল্ট ফাংশন ব্যবহার করতে হবে যা প্যারামিটার হিসাবে কোনও পরিসীমা গ্রহণ করে এবং ফলাফলকে আউটপুট দেয় স্ট্রিং আপনি ব্যবহার করতে পারেন। আমি নীচে আমি উভয় উপায়ে বিশদ, কিন্তু আমি দ্বিতীয় পছন্দ।

    সমস্ত গুগল স্প্রেডশিট জন্য: =myFunction(ADDRESS(row(A1),COLUMN(A1),4)&":"&ADDRESS(row(A2),COLUMN(A2),4));

    নতুন গুগল শিটের জন্য: =myFunction(CELL("address",A1)&":"&CELL("address",A2));


আপনি কীভাবে "অন্যান্য কোষের জন্য বুদ্ধিমানের সাথে রেঞ্জের রেফারেন্সগুলি অনুলিপি করছেন" এর অর্থ কী তা ব্যাখ্যা করতে পারেন?
ইমারসন ফারুগিয়া

Lifesaver হয়। এটি কাজ করে, আপনাকে ধন্যবাদ।
Jithin Pavithran

@ এমারসন ফারুগিয়া আমি যখন আপনি একটি ঘর থেকে অন্য ঘরে ফাংশনগুলি অনুলিপি করেন তখন গুগল শিটগুলি আপেক্ষিক সেল রেফারেন্সের জন্য স্বয়ংক্রিয় আপডেট করার সক্ষমতা উল্লেখ করছি
নাথান হান্না

9

rangeজাভাস্ক্রিপ্টের 2 ডি অ্যারে হিসাবে বিবেচনা করা হয়। আপনি এর সাথে সারি range.lengthসংখ্যা এবং এর সাথে কলামগুলির সংখ্যা পেতে পারেন range[0].length। আপনি সারি থেকে মান পেতে চান rএবং কলাম cব্যবহার: range[r][c]


আমি ব্যাপ্তির প্রথম কলামটি কী তা জানার চেষ্টা করছি। উদাহরণস্বরূপ, C1: F1 পরিসীমাটিতে, আমি জানতে চাই যে কলামটি সি থেকে শুরু হয়ে গেছে
সেনসফুল

তোমার মত একটি সেল আপনার ফাংশন ব্যবহার করব @Senseful এমন: =myFunction(C1:F1)তারপর, ফাংশন ভিতরে range[0][0]মান ফিরে আসবে C1, range[0][1]এর মান ফিরে আসবে D1, range[0][2]এর মান ফিরে আসবে E1, ইত্যাদি .. বোঝানো গিয়েছে?
লিপিস

আমি মনে করি আমি নিজেকে পরিষ্কারভাবে ব্যাখ্যা করছি না ... এই প্রশ্নের আপনার উত্তরটি দেখুন । আপনি সুপারিশ করেছেন যে আমি ব্যবহার করি =weightedAverage(B3:D3,$B$2:$D$2), আমি দ্বিতীয় তর্কটি (যেমন আমি এটি হিসাবে কল করতে চাই =weightedAverage(B3:D3)) না পাঠিয়ে ফাংশনটিকে আরও ত্রুটি প্রমাণ করতে চাই এবং তারপরে কোডটি স্বয়ংক্রিয়ভাবে জানতে হবে যে পরিসীমাটি বি থেকে শুরু হবে এবং শেষ হবে ডি, সুতরাং এটি দ্বিতীয় সারির থেকে সংশ্লিষ্ট মানগুলি পেয়েছে। দ্রষ্টব্য: "2" মানটি হার্ডকোড করা যেতে পারে, তবে "বি" হার্ডকোড করা উচিত নয়।
সংবেদনশীল

1
@ সেনসফুল সাধারণভাবে আমি হার্ডকোডযুক্ত স্টাফের বিরুদ্ধে, এবং আমার মনে হয় ওজনযুক্ত গড় দুটি প্যারাম নিলে এটি আরও পরিষ্কার হয়। সুতরাং আপনি যদি হার্ড কোডের বিষয়ে থাকেন তবে আপনি আরও অনেক কাজ করতে পারেন। আমি এখনই খুঁজে পাচ্ছি না যে কীভাবে আমরা Bপ্রদত্ত range। আপনি রেঞ্জ এবং কোষগুলির সাথে কীভাবে খেলতে পারবেন সে সম্পর্কে ধারণা পাওয়ার জন্য আমি আপনাকে পরামর্শ দেওয়া নির্দেশিকা ( goo.gl/hm0xT ) এর মাধ্যমে যেতে পরামর্শ দিচ্ছি already
লিপিস

6

Rangeগুগল স্প্রেডশিট ফাংশনে কোনও পাস করার সময় ফ্রেমওয়ার্কটি paramRange.getValues()সুস্পষ্টভাবে কার্যকর করে এবং আপনার ফাংশনটি রেঞ্জের মানগুলি স্ট্রিং, সংখ্যা বা বস্তুর (যেমন Date) এর 2-মাত্রিক অ্যারে হিসাবে গ্রহণ করে । Rangeঅবজেক্ট আপনার কাস্টম স্প্রেডশিট ফাংশন প্রেরণ করা হয় না।

TYPEOF()নিচে ফাংশন আপনাকে বলতে হবে কোন ডেটা ধরনের আপনি প্যারামিটার হিসাবে পাবেন। সূত্রটি

=TYPEOF(A1:A4)

স্ক্রিপ্টটি এভাবে কল করবে:

ফাংশন ক্যালকুলেটসেল () {
  var ফলাফলCell = স্প্রেডশিট অ্যাপ.গেটঅ্যাকটিভশিট ()। getActiveCell ();
  var paramRange = স্প্রেডশিট অ্যাপ.গেটএ্যাকটিভশিট ()। getRange ('এ 1: এ 4');
  var paramValues ​​= paramRange.getValues ​​();

  var ফলাফলValue = TYPEOF (প্যারামভ্যালু);

  resultCell.setValue (resultValue);
}
টাইপ টাইপ (মান) {
  যদি (টাইপফুল মান! == 'অবজেক্ট')
    টাইপফোন মূল্য;

  var বিবরণ = '';
  যদি (অ্যারে উদাহরণস্বরূপ) {
    বিশদ বিবরণ + = '[' + মান। দৈর্ঘ্য + ']';
    যদি (অ্যারে মান [0] উদাহরণ)
      বিশদ বিবরণ + = '[' + + মান [0]। দৈর্ঘ্য + ']';
  }

  var className = value.constructor.name;
  ClassName + বিশদ বিবরণ;
}

3

বিকল্প হিসাবে, @ লিপিসের মন্তব্যে অনুপ্রাণিত হয়ে , আপনি অতিরিক্ত পরামিতি হিসাবে সারি / কলাম স্থানাঙ্কের সাথে আপনার ফাংশনটিকে কল করতে পারেন:

=myFunction(B1:C2; ROW(B1); COLUMN(B1); ROW(C2); COLUMN(C2))

এই ফর্মটিতে সূত্রটি সহজেই অন্য কক্ষে অনুলিপি করা যায় (বা টেনে আনা), এবং ঘর / পরিসীমা উল্লেখগুলি স্বয়ংক্রিয়ভাবে সামঞ্জস্য হবে।

আপনার স্ক্রিপ্ট ফাংশনটি আপডেট করা দরকার:

function myFunction(rangeValues, startRow, startColumn, endRow, endColumn) {
  var range = SpreadsheetApp.getActiveSheet().getRange(startRow, startColumn, endRow - startRow + 1, endColumn - startColumn + 1);
  return "Range: " + range.getA1Notation();
}

লক্ষ্য করুন getRangeফাংশন লাগে startRow, startColumn, এবং তারপর সংখ্যা সারির, এবং সংখ্যা কলামের - না শেষ সারি এবং শেষ কলাম। সুতরাং, পাটিগণিত।


আমি আশা করি এটাই সঠিক উত্তর। ROW এবং COLUMN।
জিয়ানওয়ু চেন

3

এটি করা যেতে পারে । অ্যাক্টিভ সেলটিতে সূত্রটি বিশ্লেষণ করে যে কেউ উত্তীর্ণ পরিসীমাটির রেফারেন্স পেতে পারে, এটি সূত্রযুক্ত ঘর। এটি অনুমান করে তোলে যে কাস্টম ফাংশনটি নিজেরাই ব্যবহৃত হয়, এবং আরও জটিল অভিব্যক্তির অংশ হিসাবে নয়: যেমন =myfunction(A1:C3), না =sqrt(4+myfunction(A1:C3))

এই ফাংশনটি উত্তীর্ণের ব্যাপ্তির প্রথম কলাম সূচি প্রদান করে।

function myfunction(reference) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var formula = SpreadsheetApp.getActiveRange().getFormula();
  var args = formula.match(/=\w+\((.*)\)/i)[1].split('!');
  try {
    if (args.length == 1) {
      var range = sheet.getRange(args[0]);
    }
    else {
      sheet = ss.getSheetByName(args[0].replace(/'/g, ''));
      range = sheet.getRange(args[1]);
    }
  }
  catch(e) {
    throw new Error(args.join('!') + ' is not a valid range');
  }

  // everything so far was only range extraction
  // the specific logic of the function begins here

  var firstColumn = range.getColumn();  // or whatever you want to do with the range
  return firstColumn;
}

আমি মনে করি যে এই পোস্টটি স্ট্যাক ওভারফ্লো সম্পর্কে নীচের প্রশ্নেরও জবাব দিয়েছে : স্প্রেডশিট ফাংশনগুলির জন্য সেল রেফারেন্সগুলি পাস করা
রুবুন

2

আমি ব্যবহারকারীর79865 এর উত্তরে চমৎকার ধারণাটি প্রসারিত করেছি , এটি আরও ক্ষেত্রে কাজ করার জন্য এবং একাধিক যুক্তি দিয়ে কাস্টম ফাংশনে প্রেরণ করা হয়েছে।

এটি ব্যবহার করতে, নীচের কোডটি অনুলিপি করুন এবং তারপরে আপনার কাস্টম ফাংশন কলটিতে GetParamRanges()এটি আপনার ফাংশনের নামটি দিয়ে যাবেন:

function CustomFunc(ref1, ref2) {

  var ranges = GetParamRanges("CustomFunc"); // substitute your function name here

  // ranges[0] contains the range object for ref1 (or null)
  // ranges[1] contains the range object for ref2 (or null)

  ... do what you want

  return what_you_want;
}

এখানে কোনও ঘরের রঙ ফেরানোর উদাহরণ দেওয়া হল:

/**
* Returns the background color of a cell
*
* @param {cell_ref} The address of the cell
* @return The color of the cell
* @customfunction
*/
function GetColor(ref) {

  return GetParamRanges("GetColor")[0].getBackground();
}

এখানে কোড এবং আরও কিছু ব্যাখ্যা:

/**
* Returns an array of the range object(s) referenced by the parameters in a call to a custom function from a cell
* The array will have an entry for each parameter. If the parameter was a reference to a cell or range then 
* its array element will contain the corresponding range object, otherwise it will be null.
*
* Limitations:
* - A range is returned only if a parameter expression is a single reference.
*   For example,=CustomFunc(A1+A2) would not return a range.
* - The parameter expressions in the cell formula may not contain commas or brackets.
*   For example, =CustomFunc(A1:A3,ATAN2(4,3),B:E) would not parse correctly.
* - The custom function may not appear more than once in the cell formula.
* - Sheet names may not contain commas, quotes or closing brackets.
* - The cell formula may contain white space around the commas separating the custom function parameters, or after
*   the custom function name, but not elsewhere within the custom function invocation.
* - There may be other limitations.
* 
* Examples:
*   Cell formula: =CUSTOMFUNC($A$1)
*   Usage:        var ranges = GetParamRanges("CustomFunc");
*   Result:       ranges[0]: range object for cell A1 in the sheet containing the formula
*
*   Cell formula: =CUSTOMFUNC(3, 'Expenses'!B7)
*   Usage:        var ranges = GetParamRanges("CustomFunc");
*   Result:       ranges[0]: null
*                 ranges[1]: range object for cell B7 in sheet Expenses
* 
*   Cell formula: =sqrt(4+myfunction(A1:C3))
*   Usage:        var ranges = GetParamRanges("MyFunction");
*   Result:       ranges[0]: range object for cells A1 through C3 in the sheet containing the formula
*
*   Cell formula: =CustomFunc(A1+A2, A1, A2)
*   Usage:        var ranges = GetParamRanges("CustomFunc");
*   Result:       ranges[0]: null
*                 ranges[1]: range object for cell A1 in the sheet containing the formula
*                 ranges[2]: range object for cell A2 in the sheet containing the formula
*
* @param {funcName} The name of the custom function (string, case-insensitive)
* @return The range(s) referenced by the parameters to the call
*/
function GetParamRanges(funcName) {
  var ourSheet = SpreadsheetApp.getActiveSheet();
  var formula = SpreadsheetApp.getActiveRange().getFormula();
  var re = new RegExp(".+" + funcName + "\\s*\\((.*?)\\)","i");
  var ranges=[]; // array of results

  try {
    var args = formula.match(re)[1].split(/\s*,\s*/) // arguments to custom function, separated by commas
    // if there are no args it fails and drops out here

    for (var i=0; i<args.length; i++) {
      var arg=args[i].split('!'); // see if arg has a sheet name
      try {
        if (arg.length == 1) { // if there's no sheet name then use the whole arg as the range definition
          ranges[i] = ourSheet.getRange(arg[0]);
        }
        else { // if there's a sheet name, use it (after removing quotes around it)
          var sheetName=arg[0].replace(/'/g, '');
          var otherSheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
          ranges[i] = otherSheet.getRange(arg[1]);
        }
      }
      catch(e) { // assume it couldn't be identified as a range for whatever reason
        ranges[i]=null;
      }
    }
  }
  catch(e) {}

  return ranges
}

1
মোটেও খারাপ নয়, তবে দয়া করে বলুন যে এটি অনুমিতিটিকে একটি সূত্রের মধ্যে একবার অনুপ্রবেশ ফাংশন ব্যবহার করা হয়েছে। ফাইতে আমি আনুষ্ঠানিক ব্যবহার করতে পেলাম: = কাউন্টক্লকলার (বি 5: বি 38, $ এ 40) / 2 + গণনা , $ এ 43) / 2 + কাউন্টককালার (বি 5: বি 38, $ এ 44) / 2 যা আমি এটি কীভাবে বুঝতে পারি তা এইভাবে কাজ করবে না। যদি আমরা এটি সমাধান করতে সক্ষম হয়েছি তবে এটি দুর্দান্ত হবে।
হেমসে

1

আমি গুগল অ্যাপস স্ক্রিপ্টের মাধ্যমে গুগল স্প্রেডশিটে দুটি পৃথক কাস্টম ফাংশন আলাদা করতে পারি:

  1. একটি যা একটি এপিআইয়ের জন্য কল করে; স্প্রেডশিট অ্যাপ, ( উদাহরণস্বরূপ )
  2. এমন কোনও যা কোনও কল করে না, ( উদাহরণস্বরূপ )

প্রথম ফাংশনটি যে কোনও কিছু করতে সক্ষম। স্প্রেডশিট পরিষেবাটি কল করা ছাড়াও এটি Gmail অ্যাপ্লিকেশন বা গুগল দ্বারা উপলব্ধ যে কোনও পরিষেবাতে কল করতে পারে। এপিআই কলগুলি প্রক্রিয়াটি ধীর করবে। উপলব্ধ সমস্ত পদ্ধতি অ্যাক্সেস করার জন্য একটি পরিসরটি ফাংশনটির মধ্য দিয়ে যেতে পারে বা পুনরুদ্ধার করা যায়।

দ্বিতীয় ফাংশনটি কেবলমাত্র "স্প্রেডশিট" এ সীমাবদ্ধ। এখানে ডেটা পুনরায় কাজ করতে জাভাস্ক্রিপ্ট ব্যবহার করতে পারেন। এই ফাংশনগুলি সাধারণত খুব দ্রুত হয়। একটি পরিসীমা অতিক্রান্ত হয়েছে, 2D- অ্যারের মানগুলি ছাড়া আর কিছুই নয়।


আপনার প্রশ্নে, আপনি .getColumn()পদ্ধতিটি কল করে শুরু করবেন । এটি স্পষ্টভাবে ইঙ্গিত করে যে আপনার উপরে একটি বর্ণিত 1 কাস্টম ফাংশন প্রয়োজন, উপরে বর্ণিত হিসাবে।

কাস্টম ফাংশন তৈরি করতে কীভাবে স্প্রেডশিট এবং পত্রকটি সেট করবেন সে সম্পর্কে নীচের উত্তরটি দেখুন ।


1

আমি কয়েক মাস আগে এটি নিয়ে কাজ করেছিলাম এবং একটি খুব সাধারণ কুলডজ নিয়ে এসেছি: প্রতিটি কক্ষের বিষয়বস্তু হিসাবে একটি নতুন শিট তৈরি করতে হবে: সেল এ 1 এর মতো হতে পারে:

= arrayformula(cell("address",a1:z500))

শীটটির নাম রাখুন "রেফ"। তারপরে আপনার যখন সামগ্রীর পরিবর্তে স্ট্রিং হিসাবে কোনও ঘরে কোনও রেফারেন্স প্রয়োজন তখন আপনি ব্যবহার করুন:

= some_new_function('Ref'!C45)

অবশ্যই, আপনাকে ফাংশনটি একটি স্ট্রিং (একটি ঘর) বা একটি 1 ডি বা 2 ডি অ্যারে পাস করেছে কিনা তা পরীক্ষা করে দেখতে হবে। আপনি যদি একটি অ্যারে পান তবে এটিতে সমস্ত ঘরের ঠিকানা স্ট্রিং হিসাবে থাকবে তবে প্রথম কক্ষ এবং প্রস্থ এবং উচ্চতা থেকে আপনার প্রয়োজনীয় জিনিসগুলি বের করতে পারেন।


0

আমি সারা সকাল এটি নিয়ে কাজ করছি এবং উপরের উত্তর-উত্তরগুলি কী নিয়ে আলোচনা করে তার প্রমাণ দেখছি। সেনসফুল এবং আমি দুজনেই পাস করা কক্ষের অ্যাড্রেস চাই, মানটি নয়। এবং উত্তর খুব সহজ। এটা করা যায় না।

আমি এমন কিছু কাজের সন্ধান পেয়েছি যা সূত্রটি কোন কোষে রয়েছে তা নির্ধারণের উপর নির্ভর করে। এটি উপরে সেনসুলফুলকে সাহায্য করত কিনা তা বলা শক্ত। তাহলে আমি কী করছিলাম?

The data.

     [A]      [B]       [C]       [D]     [E]     [F]       [H]
[1] Name      Wins     Losses    Shots   Points   Fouls   Most recent
                                                          WL Ratio
[2] Sophia     4         2         15      7       1         0
[3] Gloria     11        3         11      6       0         0
[4] Rene       2         0         4       0       0         0
[5] Sophia     7         4         18      9       1         1.5

কলাম এইচ হ'ল সোফিয়ার (জয় - প্রি উইন্ডস) / (হার - পূর্ববর্তী)

(7 - 4) / (4 - 2) = 1.5

তবে আমরা জানি না যে সোফিয়া এর আগে কোন সারিটিতে উপস্থিত হয়েছিল
name আপনি যদি নাম কলাম হিসাবে হার্ড-কোড করেন তবে VLOOKUP ব্যবহার করে এটি করা যেতে পারে। ভিএলুকআপের পরে, আমি কিছু # এনএনএ (নাম খুঁজে পাইনি) এবং # ডিআইভি0 (ডিনোমিনেটর শূন্য) পাচ্ছি এবং এই পরিস্থিতিতে আরও স্পষ্টতুল্য পাঠ্য দেখানোর জন্য এটি = আইএফ (আইএফ (...)) দিয়ে মুড়িয়ে ফেলছি। এখন আমি একটি মারাত্মক আকারে বড় প্রকাশ পেয়েছিলাম যা অনর্থক এবং রক্ষণাবেক্ষণযোগ্য ছিল। সুতরাং আমি ম্যাক্রো সম্প্রসারণ (অস্তিত্ব নেই) বা কাস্টম ফাংশন চেয়েছিলাম।

তবে যখন আমি একটি সহায়ক সাবট্র্যাক্টপ্রিভালিউ (সেল) তৈরি করেছি তখন এটি বি 5 এর পরিবর্তে "7" পাচ্ছিল। পাস হওয়া আর্গুমেন্টগুলি থেকে সেল বা রেঞ্জের অবজেক্টগুলি পাওয়ার কোনও অন্তর্নির্মিত উপায় নেই।
যদি আমি ব্যবহারকারীর ঘরের নাম ডাবল কোটে হ্যান্ড-প্রবেশ করি তবে আমি এটি করতে পারি ... সাবট্র্যাক্টপ্রিভ্যালু ("বি 5")। তবে এটি সত্যই হ্যামস্ট্রিংস অনুলিপি / পেস্ট এবং আপেক্ষিক সেল বৈশিষ্ট্যগুলি।

কিন্তু আমি তখন একদম সন্ধান পেয়েছি।

স্প্রেডশিট অ্যাপ.গেটএ্যাকটিভরেঞ্জ () হ'ল সেই সেল যা সূত্র ধারণ করে। আসলেই আমার জানা দরকার। সারির নম্বর। নিম্নলিখিত ফাংশনটিতে একটি NUMERIC কলাম নম্বর নিবে এবং সেই কলামটিতে পূর্বের উপস্থিতিগুলি বিয়োগ করে।

function SubtractPrevValue(colNum) 
{
  var curCell = SpreadsheetApp.getActiveRange();
  var curSheet = curCell.getSheet();
  var curRowIdx = curCell.getRowIndex();
  var name = curSheet.getRange(curRowIdx, 1).getValue();  // name to match
  var curVal =  curSheet.getRange(curRowIdx, colNum).getValue();

  var foundRowIdx = -1;
  for (var i=curRowIdx-1;i>1;i--)
  { 
    if (curSheet.getRange(i, 2).getValue() == name)
    {
      return curVal - curSheet.getRange(i, colNum).getValue();
    }
  }
  return curVal;  //default if no previous found
}

তবে আমি আবিষ্কার করেছি যে এটি সত্যিই ধীর। "চিন্তাভাবনা ..." প্রদর্শন করার সময় এক এবং দুই সেকেন্ড বিলম্ব হয় তাই আমি ব্যপকভাবে অবহেলিত, অচিন্তনীয় কার্যপত্রক সূত্রে ফিরে আসছি।


0

"রেঞ্জ" অবজেক্ট সরবরাহ করার পরিবর্তে গুগল বিকাশকারীরা এলোমেলোভাবে ডেটা টাইপ করে। সুতরাং, আমি ইনপুটটির মান মুদ্রণ করতে নিম্নলিখিত ম্যাক্রোটি বিকাশ করেছি।

function tp_detail(arg)
{
    var details = '';

    try
    {
        if(typeof arg == 'undefined')
           return details += 'empty';

        if (typeof arg !== 'object')
        {
            if (typeof arg == 'undefined')
                return details += 'empty';

            if (arg.map)
            {
                var rv = 'map: {';
                var count = 1;
                for (var a in arg)
                {
                    rv += '[' + count + '] ' + tp_detail(a);
                    count = count + 1;
                }
                rv += '}; '
                return rv;
            }
            return (typeof arg) + '(\'' + arg + '\')';
        }


        if (arg instanceof Array)
        {
            details += 'arr[' + arg.length + ']: {';
            for (var i = 0; i < arg.length; i++)
            {
                details += '[' + i + '] ' + tp_detail(arg[i]) + ';';
            }
            details += '} ';
        }
        else
        {

            var className = arg.constructor.name;
            return className + '(' + arg + ')';
        }
    }
    catch (e)
    {
        var details = '';
        details = 'err : ' + e;
    }


    return details;
}

0

পূর্বের উত্তরগুলির আমার সংকলন আছে

**
 *
 * @customfunction
 **/
function GFR(){
  var ar = SpreadsheetApp.getActiveRange();
  var as = SpreadsheetApp.getActive();
  return ar.getFormula()
    .replace(/=gfr\((.*?)\)/i, '$1')
    .split(/[,;]/)
    .reduce(function(p, a1Notation){
      try{
        var range = as.getRange(a1Notation);
        p.push(Utilities.formatString(
          'Is "%s" a Range? %s', 
          a1Notation,
          !!range.getDisplayValues
        ));
      } catch(err){
        p.push([a1Notation + ' ' + err.message]);
      }
    return p;
  },[]);
}

এটি বর্তমান সূত্র নেয় এবং এটি কোনও ব্যাপ্তি কিনা তা যাচাই করে।

=GFR(A1:A5;1;C1:C2;D1&D2) আয়

|Is "A1:A5" a Range? true|
|1 Range not found       |
|Is "C1:C2" a Range? true|
|D1&D2 Range not found   |

সম্পূর্ণ রচনাটির জন্য টিসি এই জাতীয় কিছু কল করতে পারে

var range = as.getRange(a1Notation);
var column = range.getColumn();

-1

যুক্তি হিসাবে ফাংশন এবং পাসের সীমা তৈরি করুন:

function fn(input) {
    var cell = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0].getRange(SpreadsheetApp.getActiveRange().getFormula().match(/=\w+\((.*)\)/i)[1].split('!'));
    // above ... cell is "range", can convert to array?
    var sum=0;
    for (var i in cell.getValues() ){
        sum = sum + Number(cell.getValues()[i]);
    }  
    return sum;
}

স্প্রেডশিটে ব্যবহার:

=fn(A1:A10)

এটি মান হিসাবে প্রদর্শিত হবে sum(A1:A10)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.