গুগল শীটে একটি কাস্টম ফাংশন দ্বারা পুনরুদ্ধার করা ডেটা রিফ্রেশ করুন


92

আমি একটি কাস্টম গুগল অ্যাপস স্ক্রিপ্ট লিখেছি যা idএকটি ওয়েব পরিষেবাদি (একটি দাম) থেকে একটি তথ্য সংগ্রহ এবং আনবে ।

আমি এই স্ক্রিপ্টটি একটি স্প্রেডশিটে ব্যবহার করি এবং এটি ঠিক কাজ করে। আমার সমস্যা হ'ল এই দামগুলি পরিবর্তন হয় এবং আমার স্প্রেডশিটটি আপডেট হয় না।

আমি কীভাবে এটিকে স্ক্রিপ্টটি পুনরায় চালাতে এবং ঘরগুলি আপডেট করতে বাধ্য করতে পারি (ম্যানুয়ালি প্রতিটি কক্ষের উপরে না গিয়ে)?


4
হ্যাঁ, আমি এখানে এটি দিয়েছিলাম একটি ব্যাখ্যা: stackoverflow.com/questions/9022984/…
হেনরিক G. Abreu

আমি আমার গবেষণার অংশ হিসাবে আপনার ব্যাখ্যাটি পড়েছি। অনেক সহায়ক, ধন্যবাদ। আমি আমার উত্তরের লিঙ্কটি যুক্ত করেছি।
tbkn23

: অনুরূপ (সংজ্ঞায়িত এবং লজিক্যাল, কিন্তু কখনও কখনও দুর্ভাগা) আচরণ সম্মুখীন তাদের জন্য, তবে এটি Google ইস্যু ট্র্যাকার এই বৈশিষ্ট্যটি অনুরোধ ভোট দিন যেতে সাহায্য করতে পারে issuetracker.google.com/issues/36763858
টিমোথি জনস

এখানে আমি একটি সহজ উত্তর
এরিয়ালগুলি

রিয়াল সমাধান নীচে উপস্থিত: stackoverflow.com/a/56802017 এবং stackoverflow.com/a/61946592
TheMaster

উত্তর:


92

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

এখানে আরও তথ্য দেখুন: https://code.google.com/p/google-apps-script-issues/issues/detail?id=888

এবং এখানে: ডেটা সংশোধন করার জন্য স্ক্রিপ্ট আপডেট হচ্ছে না

আমার সমাধানটি ছিল আমার স্ক্রিপ্টে অন্য একটি পরামিতি যুক্ত করা, যা আমি এমনকি ব্যবহার করি না। এখন, আপনি যখন পূর্ববর্তী কলগুলির চেয়ে পৃথক কোনও পরামিতি সহ ফাংশনটি কল করবেন তখন এটি স্ক্রিপ্টটি পুনরায় চালু করতে হবে কারণ এই পরামিতিগুলির ফলাফল ক্যাশে থাকবে না।

সুতরাং যখনই আমি ফাংশনটি কল করি, অতিরিক্ত প্যারামিটারের জন্য আমি "$ A $ 1" পাস করি। আমি রিফ্রেশ নামে একটি মেনু আইটেমও তৈরি করেছি এবং আমি এটি চালানোর পরে এটি বর্তমান তারিখ এবং সময়কে A1 তে রাখে, সুতরাং দ্বিতীয় পরামিতি হিসাবে $ A $ 1 সহ স্ক্রিপ্টের সমস্ত কলকে পুনরায় গণনা করতে হবে। আমার স্ক্রিপ্ট থেকে কিছু কোড এখানে দেওয়া হয়েছে:

function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "Refresh",
    functionName : "refreshLastUpdate"
  }];
  sheet.addMenu("Refresh", entries);
};

function refreshLastUpdate() {
  SpreadsheetApp.getActiveSpreadsheet().getRange('A1').setValue(new Date().toTimeString());
}

function getPrice(itemId, datetime) {
  var headers =
      {
        "method" : "get",
        "contentType" : "application/json",
        headers : {'Cache-Control' : 'max-age=0'}
      };

  var jsonResponse = UrlFetchApp.fetch("http://someURL?item_id=" + itemId, headers);
  var jsonObj = eval( '(' + jsonResponse + ')' );
  return jsonObj.Price;
  SpreadsheetApp.flush();
}   

এবং যখন আমি আইডি 5 সহ আইটেমের দাম কোনও ঘরে রাখতে চাই, আমি নীচের সূত্রটি ব্যবহার করি:

=getPrice(5, $A$1)

আমি যখন দামগুলি রিফ্রেশ করতে চাই, আমি কেবল "রিফ্রেশ" -> "রিফ্রেশ" মেনু আইটেমটিতে ক্লিক করি। মনে রাখবেন onOpen()স্ক্রিপ্ট পরিবর্তন করার পরে আপনার স্প্রেডশিটটি পুনরায় লোড করা দরকার ।


4
এখন অতিরিক্ত পরামিতি হিসাবে কেন ব্যবহার করছেন না?
উন্নত

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

4
ভাল সন্ধান। ইনপুট হিসাবে নামযুক্ত রেঞ্জগুলি ব্যবহার করার সময় আমার এই সমস্যা হয়েছিল। আপনার উত্তরটি ব্যবহার করে, আমি বুঝতে পেরেছিলাম যে ইনপুটগুলির পরিসীমাটির তুলনায় একটি ডমি যোগফলটি প্রায়শই যথেষ্ট, যেমন "যোগফল (বি: ডি)", যেখানে সারি বিডি কাস্টম ফাংশন দ্বারা সীমাবদ্ধ থাকে। যে কোনও ঘর পরিবর্তন করলে যোগফলকে পরিবর্তনের জন্য এবং কাস্টম ফাংশনটিকে রিফ্রেশ করার জন্য ট্রিগার করবে। যাইহোক, দেখে মনে হচ্ছে কাস্টম ফাংশনটিকে এমনকি উপেক্ষা করা প্যারামিটারটি ঘোষণা করতে হবে না।
শন হুভার

4
একটি লজ্জাজনক বিষয় যা এখনও এই সমস্যার আমি খুঁজে পেয়েছি এটিই সেরা সমাধান। গুগল কেবলমাত্র নির্দিষ্ট ক্রিয়াকলাপের জন্য ক্যাশে অক্ষম করার অনুমতি দেওয়ার পরিবর্তে আমরা ক্যাশে কী পরিমাণ সঞ্চিত তা কেবল আমাদের ক্যাশে মূল্য না পাওয়া যায় তা নিশ্চিত করার জন্য আমরা নির্বিচারে বৃদ্ধি করি ... তবুও পোস্টের জন্য ধন্যবাদ
গ্রেডফক্স


33

আমি জানি এটি কিছুটা পুরানো প্রশ্ন। তবে এই পদ্ধতিতে কোনও পরিবর্তন ছাড়া কোনও ব্যবহারকারীর ক্রিয়া প্রয়োজন হয় না।

আমি যা করেছি তা টিবিকেএন 23 এর অনুরূপ।

আমি যে ফাংশনটি পুনরায় মূল্যায়ন করতে চাই তার একটি অতিরিক্ত অব্যবহৃত প্যারামিটার, $ এ $ 1 রয়েছে। সুতরাং ফাংশন কল হয়

=myFunction(firstParam, $A$1)

তবে কোডটিতে ফাংশনের স্বাক্ষর

function myFunction(firstParam)

রিফ্রেশ ফাংশন না হয়ে আমি এইভাবে অনডিট (ই) ফাংশনটি ব্যবহার করেছি

function onEdit(e)
{
   SpreadsheetApp.getActiveSheet().getRange('A1').setValue(Math.random());
}

এই ফাংশনটি ট্রিগার করা হয় যখনই স্প্রেডশীটের কোনও ঘর সম্পাদনা করা হয়। সুতরাং এখন আপনি একটি ঘর সম্পাদনা করুন, এ্যান্ডে একটি এলোমেলো সংখ্যা স্থাপন করা হয়েছে, এটি tbkn23 এর প্রস্তাবিত পরামিতি তালিকাটিকে রিফ্রেশ করে, যার ফলে কাস্টম ফাংশনটি পুনরায় মূল্যায়ন করা যায়।


4
দুর্দান্ত কাজ করে। ডাউনসাইড হ'ল, পূর্বাবস্থায় ফেরা (সিটিআরএল + জেড) ইতিহাস বিশৃঙ্খলাবদ্ধ।
জন

4
জোন ইঙ্গিত করার সাথে সাথে একটি বিরক্তিকর ডাউনসাইডের সাথে দুর্দান্ত কৌশল ... আমি আশা করি যে কেউ এটির উন্নতি করবে :-)
এনিসে

এই উত্তর সহ ছোট এবং পেডেন্টিক ক্যাভ্যাট; অবিশ্বাস্যভাবে অসম্ভব ইভেন্টে ম্যাথ.র্যান্ডম একই নম্বরটি দেয়, সেই উপলক্ষে এটি আপডেট হবে না কারণ সেই নির্দিষ্ট নম্বরটি ইতিমধ্যে ক্যাশে হয়েছে been
উডি পায়েেন

12

এটি খুব দেরি হয়ে গেছে এবং আমি জানি না এটি কার্যকর হবে তবে বাস্তবে এখানে সেটিংস রয়েছে আপনি NOW()স্বয়ংক্রিয়ভাবে আপডেট করতে পারবেন

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


4
NOW()একটি অন্তর্নির্মিত ফাংশন, কোনও কাস্টম ফাংশন নয়।
রুবনে

@ রুবুন মূল কথাটি হ'ল আপনি যে কোনও কাস্টম ফাংশনে এটি আপডেট করতে চান এখনই () ফাংশনটি অন্তর্ভুক্ত করতে পারেন
থাইনা

13
এই সময়ে কাস্টম ফাংশন আর্গুমেন্টগুলি ডিটারমিনিস্টিক হওয়া উচিত, অন্য কথায়, তারা এখন আর্গুমেন্ট হিসাবে সংযুক্ত করে না। ডেভেলপারস
google.com/apps-script/guides/sheets/funitions

4
আপনি যদি কাস্টম ফাংশনের ভিতরে এখনই () ব্যবহার করার চেষ্টা করেন তবে এটি একটি ত্রুটি ছুঁড়ে দেয়
স্টেফানো গিয়াকোন

6

যদি আপনার কাস্টম ফাংশনটি একটি নির্দিষ্ট কলামের অভ্যন্তরে থাকে তবে কেবল আপনার ক্রেডটি দিয়ে আপনার স্প্রেডশিটটি অর্ডার করুন।

অর্ডারিং অ্যাকশনটি ডেটাটিকে রিফ্রেশ করার জন্য বাধ্য করে, যা একবারে সেই কলামের সমস্ত সারিগুলির জন্য আপনার কাস্টম ফাংশনটি আহ্বান করে।


1

এটি একটি অতি পুরানো থ্রেড হতে পারে তবে কারও পক্ষে এটি করার চেষ্টা করা কার্যকর হতে পারে, যেমনটি আমি এখনই ছিলাম।

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

সুতরাং, ঘোষণা যেমন: ফাংশন মাই ফাংশন (ফার্স্টপ্যারাম, ডামি) এবং তারপরে এটি কল করা যেমন প্রস্তাবিত হয়েছে তেমনই হবে। এটা আমার জন্য কাজ করেছে।

এছাড়াও, যদি আপনি সম্পাদনা করেন এমন সমস্ত শিটগুলিতে এলোমেলো পরিবর্তনশীল উপস্থিত হওয়ার উপদ্রব হয় তবে একটি শীটে সীমাবদ্ধ করার একটি সহজ প্রতিকার নিম্নরূপ:

function onEdit(e)
{
  e.source.getSheetByName('THESHEETNAME').getRange('J1').setValue(Math.random());
}

4
@ রুবন এটি খুব একই রকম তবে ভাল উপদ্রব সহ; সক্রিয় শীটটি ব্যবহার না করে এটি একটি সংজ্ঞায়িত শিটের নাম ব্যবহার করে, আপনার ইতিহাসের উন্নতি করে
জোনাস ডি

1

স্ক্রিপ্ট লজিক:

  • যুক্তি পরিবর্তিত না হলে কাস্টম ফাংশন আপডেট হয় না।
  • টেক্সটফাইন্ডার ব্যবহার করে স্প্রেডশিটে সমস্ত কাস্টম ফাংশনের সমস্ত যুক্তি পরিবর্তন করতে একটি onChange ট্রিগার তৈরি করুন

স্নিপেট:

/*@customfunction*/
function sheetNames(e) {
  return SpreadsheetApp.getActive()
    .getSheets()
    .map(function(sheet) {
      return sheet.getName();
    });
}

/*Create a installable trigger to listen to grid changes on the sheet*/
function onChange(e) {
  if (!/GRID/.test(e.changeType)) return; //Listen only to grid change
  SpreadsheetApp.getActive()
    .createTextFinder('=SHEETNAMES\\([^)]*\\)')
    .matchFormulaText(true)
    .matchCase(false)
    .useRegularExpression(true)
    .replaceAllWith(
      '=SHEETNAMES(' + (Math.floor(Math.random() * 500) + 1) + ')'
    );
}

পড়তে:


1

যেমনটি আগে উল্লেখ করা হয়েছে:

যুক্তি পরিবর্তিত না হলে কাস্টম ফাংশন আপডেট হয় না।

সম্ভাব্য সমাধানটি হ'ল একটি একক কক্ষে একটি চেকবক্স তৈরি করা এবং কাস্টম ফাংশনের আর্গুমেন্ট হিসাবে এই ঘরটি ব্যবহার করা:

  1. একটি চেকবক্স তৈরি করুন: ফ্রি সেল যেমন নির্বাচন করুন [এ 1], [সন্নিবেশ করুন]> [চেকবক্স] এ যান
  2. এই ঘরটিকে একটি আর্গুমেন্ট করুন: =myFunction(A1)
  3. সূত্রটি রিফ্রেশ করতে চেকবাক্সটি ক্লিক করুন

-3

আপনি যদি একটি কাস্টম ফাংশন লিখেছেন এবং এটি আপনার স্প্রেডশীটে একটি সূত্র হিসাবে ব্যবহার করেছেন, তবে আপনি যখনই স্প্রেডশিটটি খুলবেন বা কোনও রেফারেন্সিং সেল পরিবর্তন করা হবে তখন সূত্রটি পুনরায় গণনা করা হবে।

আপনি যদি কেবল স্প্রেডশীটটির দিকে তাকিয়ে থাকতে চান এবং এর মানগুলি পরিবর্তন করতে চান তবে একটি সময়সী ট্রিগার যুক্ত করার কথা বিবেচনা করুন যা ঘরগুলি আপডেট করবে। ট্রিগার সম্পর্কে এখানে আরও পড়ুন


10
এটি কেবল দুর্দান্ত হবে, এটি কাজ না করে ... পৃষ্ঠাটি পুনরায় লোড করা মানগুলি রিফ্রেশ করে না। তদুপরি, ঘরটি মুছে ফেলা এবং একই ফাংশন কলটিতে পুনরায় প্রবেশ করা, এখনও পুরানো মান রাখে। যদি আমি একই ফাংশনটি অন্য কোনও ঘর থেকে ঠিক কল করি তবে এটি নতুন মানটি প্রদর্শন করবে তবে পুরানো ঘরে নয়।
tbkn23
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.