একটি সম্প্রদায় সংযোগকারী তৈরি করুন

কমিউনিটি কানেক্টর তৈরির ধাপগুলো হলো:

  1. একটি নতুন অ্যাপস স্ক্রিপ্ট প্রজেক্ট তৈরি করুন।
  2. কানেক্টর কোডটি লিখুন।
  3. প্রকল্পের ম্যানিফেস্টটি সম্পূর্ণ করুন।

একটি নতুন অ্যাপস স্ক্রিপ্ট প্রজেক্ট তৈরি করুন

নতুন প্রজেক্ট তৈরি করতে গুগল অ্যাপস স্ক্রিপ্ট-এ যান। অ্যাপস স্ক্রিপ্ট আপনার জন্য একটি ডিফল্ট স্ক্রিপ্ট তৈরি করে দেবে। আপনি চাইলে myFunction ফাংশনটি মুছে ফেলতে এবং প্রজেক্টটির নাম পরিবর্তন করতে পারেন। ( অ্যাপস স্ক্রিপ্ট সম্পর্কে আরও জানুন )

কানেক্টর কোডটি লিখুন

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

getAuthType() এ প্রমাণীকরণের ধরণ নির্ধারণ করুন

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

উদাহরণস্বরূপ, নিম্নলিখিত কানেক্টরটির জন্য প্রমাণীকরণের প্রয়োজন নেই:

npm-downloads/src/auth.js
var cc = DataStudioApp.createCommunityConnector();

// https://developers.google.com/datastudio/connector/reference#getauthtype
function getAuthType() {
  var AuthTypes = cc.AuthType;
  return cc
    .newAuthTypeResponse()
    .setAuthType(AuthTypes.NONE)
    .build();
}

যদি আপনার ডেটা সোর্সের জন্য OAuth 2.0 অথেনটিকেশনের প্রয়োজন হয়, তাহলে OAuth 2.0 অথেনটিকেশন গাইডটি দেখুন এবং আপনার কানেক্টরে অতিরিক্ত প্রয়োজনীয় ফাংশনগুলো যোগ করুন।

getConfig() এর মাধ্যমে কনফিগারেশন নির্ধারণ করুন

কানেক্টরের কনফিগারেশন পাওয়ার জন্য getConfig() ফাংশনটি কল করা হয়, যার মধ্যে আপনার কানেক্টরের জন্য প্রয়োজনীয় ব্যবহারকারী-প্রদত্ত মানগুলোও অন্তর্ভুক্ত থাকে। বিস্তারিত জানতে getConfig() রেফারেন্স দেখুন।

getConfig() থেকে প্রাপ্ত প্রতিক্রিয়ার উপর ভিত্তি করে, ডেটা স্টুডিও কানেক্টর কনফিগারেশন স্ক্রিনটি রেন্ডার করবে। সমর্থিত কনফিগারেশন উপাদানগুলো ConfigType রেফারেন্সে তালিকাভুক্ত করা আছে।

আপনার ডেটা সোর্সের জন্য প্যারামিটার হিসেবে তারিখের প্রয়োজন হলে, config.setDateRangeRequired(true) কল করুন। শর্তসাপেক্ষ বা ডাইনামিক কনফিগারেশন সংক্রান্ত প্রশ্ন করার প্রয়োজন হলে, স্টেপড কনফিগ দেখুন।

নিম্নলিখিতটি এমন একটি কানেক্টরের উদাহরণ যেখানে ব্যবহারকারীকে একটি npm প্যাকেজ নেম কোড প্রবেশ করাতে হয়। getConfig() ফাংশনে একটি info এবং একটি input ফিল্ড সংজ্ঞায়িত করা হয়েছে:

npm-downloads/src/main.js
// https://developers.google.com/datastudio/connector/reference#getconfig
function getConfig() {
  var config = cc.getConfig();

  config
    .newInfo()
    .setId('instructions')
    .setText(
      'Enter npm package names to fetch their download count. An invalid or blank entry will revert to the default value.'
    );

  config
    .newTextInput()
    .setId('package')
    .setName(
      'Enter a single package name or multiple names separated by commas (no spaces!)'
    )
    .setHelpText('e.g. "googleapis" or "package,somepackage,anotherpackage"')
    .setPlaceholder(DEFAULT_PACKAGE)
    .setAllowOverride(true);

  config.setDateRangeRequired(true);

  return config.build();
}

getSchema() ব্যবহার করে ফিল্ডগুলি সংজ্ঞায়িত করুন।

প্রদত্ত অনুরোধের স্কিমা পেতে এই ফাংশনটি কল করা হয়। getConfig() ফাংশন দ্বারা সংজ্ঞায়িত যেকোনো কনফিগারেশন প্যারামিটার request আর্গুমেন্টে প্রদান করা হবে। বিস্তারিত জানার জন্য getSchema() রেফারেন্স দেখুন।

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

উদাহরণস্বরূপ, যদি কোনো কানেক্টর একটি রিপোর্ট আইডি-র উপর ভিত্তি করে রিপোর্টের ডেটা ফেচ করে, তাহলে সেই রিপোর্টের জন্য ফেরত আসা ডেটা এবং ফলস্বরূপ স্কিমাটি আগে থেকে জানা নাও থাকতে পারে। এই ক্ষেত্রে getSchema() ফাংশনের জন্য ডেটা ফেচ করার প্রয়োজন হতে পারে এবং স্কিমাটি গণনা করে নিতে হবে।

npm-downloads/src/main.js
function getFields() {
  var fields = cc.getFields();
  var types = cc.FieldType;
  var aggregations = cc.AggregationType;

  fields
    .newDimension()
    .setId('packageName')
    .setName('Package')
    .setType(types.TEXT);

  fields
    .newDimension()
    .setId('day')
    .setName('Date')
    .setType(types.YEAR_MONTH_DAY);

  fields
    .newMetric()
    .setId('downloads')
    .setName('Downloads')
    .setType(types.NUMBER)
    .setAggregation(aggregations.SUM);

  return fields;
}

// https://developers.google.com/datastudio/connector/reference#getschema
function getSchema(request) {
  return {schema: getFields().build()};
}

getData() ব্যবহার করে ডেটা আনুন এবং ফেরত দিন।

প্রদত্ত অনুরোধের ডেটা পাওয়ার জন্য এই ফাংশনটি কল করা হয়। getConfig() ফাংশন দ্বারা সংজ্ঞায়িত যেকোনো কনফিগারেশন প্যারামিটার request আর্গুমেন্টে প্রদান করা হবে। বিস্তারিত জানার জন্য getData() রেফারেন্স দেখুন।

getData() অনুরোধের নিম্নলিখিত প্যারামিটারগুলির প্রতি অতিরিক্ত মনোযোগ প্রয়োজন:

  • lastRefresh
    lastRefresh হলো একটি টাইমস্ট্যাম্প যা ডেটা রিফ্রেশের জন্য করা সর্বশেষ অনুরোধের সময়কে নির্দেশ করে। আপনি new Date(timestampString) ব্যবহার করে এর মানটি পার্স করতে পারবেন। আপনি যদি অ্যাপস স্ক্রিপ্ট ক্যাশ সার্ভিস বা অন্য কোনো ক্যাশিং পদ্ধতি ব্যবহার করেন, তাহলে lastRefresh টাইমস্ট্যাম্পটি আপনাকে ডেটা সোর্সে নতুন করে ডেটা আনার অনুরোধ করবেন, নাকি ক্যাশ থেকে ডেটা সরবরাহ করবেন, তা নির্ধারণ করতে সাহায্য করতে পারে।

  • dateRange
    যদি getConfig() ফাংশনে dateRangeRequired true সেট করা হয়, তাহলে প্রতিটি getData() কলে অনুরোধের মধ্যে নির্বাচিত তারিখের পরিসরটি অন্তর্ভুক্ত থাকবে। আরও বিস্তারিত জানতে “Working with Date Ranges” দেখুন।

নিম্নলিখিত উদাহরণটি আগত অনুরোধের উপর ভিত্তি করে ডেটা সংগ্রহ করে এবং প্যাকেজের পরিসংখ্যান ফেরত দেয়:

npm-downloads/src/main.js
// https://developers.google.com/datastudio/connector/reference#getdata
function getData(request) {
  request.configParams = validateConfig(request.configParams);

  var requestedFields = getFields().forIds(
    request.fields.map(function(field) {
      return field.name;
    })
  );

  try {
    var apiResponse = fetchDataFromApi(request);
    var normalizedResponse = normalizeResponse(request, apiResponse);
    var data = getFormattedData(normalizedResponse, requestedFields);
  } catch (e) {
    cc.newUserError()
      .setDebugText('Error fetching data from API. Exception details: ' + e)
      .setText(
        'The connector has encountered an unrecoverable error. Please try again later, or file an issue if this error persists.'
      )
      .throwException();
  }

  return {
    schema: requestedFields.build(),
    rows: data
  };
}

/**
 * Gets response for UrlFetchApp.
 *
 * @param {Object} request Data request parameters.
 * @returns {string} Response text for UrlFetchApp.
 */
function fetchDataFromApi(request) {
  var url = [
    'https://api.npmjs.org/downloads/range/',
    request.dateRange.startDate,
    ':',
    request.dateRange.endDate,
    '/',
    request.configParams.package
  ].join('');
  var response = UrlFetchApp.fetch(url);
  return response;
}

/**
 * Parses response string into an object. Also standardizes the object structure
 * for single vs multiple packages.
 *
 * @param {Object} request Data request parameters.
 * @param {string} responseString Response from the API.
 * @return {Object} Contains package names as keys and associated download count
 *     information(object) as values.
 */
function normalizeResponse(request, responseString) {
  var response = JSON.parse(responseString);
  var package_list = request.configParams.package.split(',');
  var mapped_response = {};

  if (package_list.length == 1) {
    mapped_response[package_list[0]] = response;
  } else {
    mapped_response = response;
  }

  return mapped_response;
}

/**
 * Formats the parsed response from external data source into correct tabular
 * format and returns only the requestedFields
 *
 * @param {Object} parsedResponse The response string from external data source
 *     parsed into an object in a standard format.
 * @param {Array} requestedFields The fields requested in the getData request.
 * @returns {Array} Array containing rows of data in key-value pairs for each
 *     field.
 */
function getFormattedData(response, requestedFields) {
  var data = [];
  Object.keys(response).map(function(packageName) {
    var package = response[packageName];
    var downloadData = package.downloads;
    var formattedData = downloadData.map(function(dailyDownload) {
      return formatData(requestedFields, packageName, dailyDownload);
    });
    data = data.concat(formattedData);
  });
  return data;
}

প্রকল্পের ম্যানিফেস্ট সম্পূর্ণ করুন

ম্যানিফেস্ট ফাইলে আপনার কমিউনিটি কানেক্টর সম্পর্কিত তথ্য থাকে, যা ডেটা স্টুডিওতে আপনার কানেক্টরটি ডেপ্লয় এবং ব্যবহার করার জন্য প্রয়োজন।

অ্যাপস স্ক্রিপ্ট ডেভেলপমেন্ট এনভায়রনমেন্টে ম্যানিফেস্ট ফাইলটি সম্পাদনা করতে, ভিউ মেনুতে ক্লিক করে 'Show manifest file'-এ ক্লিক করুন। এটি একটি নতুন appsscript.json ম্যানিফেস্ট ফাইল তৈরি করবে।

নিম্নলিখিত তথ্য অন্তর্ভুক্ত করতে ম্যানিফেস্টটি আপডেট করুন:

npm-downloads/src/appsscript.json
{
  "dependencies": {
    "libraries": []
  },
  "dataStudio": {
    "name": "npm Downloads",
    "logoUrl": "https://raw.githubusercontent.com/npm/logos/master/npm%20square/n-64.png",
    "company": "Google Data Studio Developer Relations",
    "companyUrl": "https://developers.google.com/datastudio/",
    "addonUrl": "https://github.com/googledatastudio/community-connectors/tree/master/npm-downloads#readme",
    "supportUrl": "https://github.com/googledatastudio/community-connectors/issues",
    "description": "Get npm package download counts.",
    "sources": ["npm"],
    "templates": {
      "default": "1twu0sHjqR5dELAPyGJcw4GS3-D0_NTrQ"
    }
  },
  "oauthScopes": [
    "https://www.googleapis.com/auth/script.external_request"
  ]
}

ডেটা স্টুডিও ম্যানিফেস্ট সম্পর্কে বিস্তারিত জানতে, রেফারেন্স ম্যানিফেস্ট রেফারেন্সটি দেখুন।

পরবর্তী পদক্ষেপ

পরবর্তী পদক্ষেপ হবে আপনার কমিউনিটি কানেক্টরটি স্থাপন করা