আমি গুগল স্প্রেডশিট থেকে গুগল ডকুমেন্টে কীভাবে মার্জ করব?


20

মাইক্রোসফ্ট এক্সেল এবং মাইক্রোসফ্ট ওয়ার্ডের সাথে একটি স্প্রেডশিট থেকে একটি ওয়ার্ড ফাইলের পৃষ্ঠাগুলিতে সারিগুলি মার্জ করা সহজ। এটি traditionতিহ্যগতভাবে কাগজের মেলিংগুলি তৈরি করতে ব্যবহৃত হত। গুগল ড্রাইভ / গুগল ডক্সের সাথে আমি কীভাবে এটি করতে পারি?

প্রচুর টেমপ্লেট রয়েছে যা স্প্রেডশিট থেকে ইমেল মেল মার্জ সরবরাহ করে: আমি কীভাবে Gmail এর সাথে একটি মেইল ​​মার্জ করব? কিন্তু আমি পরে কি তা না।


আপনি কি অনুলিপি / পেস্ট করার চেষ্টা করেছেন?
জ্যাকব জান টুইনস্ট্রা

4
10,000 সারিগুলির জন্য অনুলিপি / পেস্ট করবেন? না ধন্যবাদ. শব্দ / এক্সেল ঠিক আছে।
ব্রাইস

উত্তর:


8

এজন্য আপনাকে একটি গুগল অ্যাপস স্ক্রিপ্ট লিখতে হবে । আপনি স্প্রেডশিটের প্রথম সারিটি ক্ষেত্রের নাম হতে দিতে এবং ক্ষেত্রগুলি যেমন উল্লেখ করা হয় সেখানে একটি টেম্পলেট নথি তৈরি করতে পারেন [FIELD]

সুতরাং আপনার স্প্রেডশিটটি যদি এমন দেখাচ্ছে:

NAME  |  STREET             | ZIP    | TOWN
---------------------------------------------
Vidar | Karl Johans gate 15 | 0200   | Oslo
John  | 3021 Arlington Road | 123456 | Memphis, TN

... আপনার মতো টেম্পলেট নথি থাকতে পারে

প্রিয় [NAME], [STREET] এ বসবাস করছেন, [TOWN] [জিপ] ...

আপনার স্ক্রিপ্টে একটি নতুন, খালি ডকুমেন্ট তৈরি করতে হবে এবং আপনার স্প্রেডশিটে প্রতিটি সারির জন্য একটি নতুন পৃষ্ঠা যুক্ত করুন এবং সারি মান সহ ক্ষেত্রের স্থানধারীদের সন্ধান / প্রতিস্থাপন করতে হবে।

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

আপনি এটি নিজের স্ক্রিপ্টের জন্য একটি সূচনা পয়েন্ট হিসাবে ব্যবহার করতে পারেন। আপনি যদি এটিতে থাকেন তবে আমাকে জানান, বা স্ক্রিপ্টটি শেষ করতে আমি আরও কিছুটা সময় ব্যয় করতে পারি।

স্ক্রিপ্ট সামগ্রী:

var selectedTemplateId = null;
var selectedSpreadsheetId = null;
var spreadsheetDocPicker = null;
var templateDocPicker = null;

function mailMerge(app) {
  var app = UiApp.createApplication().setTitle("Mail Merge");
  templateDocPicker = createFilePicker(app, "Choose template", 
         UiApp.FileType.DOCUMENTS, "templateSelectionHandler"); 
  templateDocPicker.showDocsPicker();
  return app;
};

function createFilePicker(app, title, fileType, selectionHandlerName) {
  Logger.log("Creating file picker for " + fileType);
  var docPicker = app.createDocsListDialog();
  docPicker.setDialogTitle(title);
  docPicker.setInitialView(fileType);
  var selectionHandler = app.createServerHandler(selectionHandlerName);
  docPicker.addSelectionHandler(selectionHandler);
  return docPicker;
}

function templateSelectionHandler(e) {
  var app = UiApp.getActiveApplication();
  selectedTemplateId = e.parameter.items[0].id;
  UserProperties.setProperty("templateId", e.parameter.items[0].id);
  Logger.log("Selected template: " + selectedTemplateId);
  var spreadsheetDocPicker = createFilePicker(app, "Choose spreadsheet", 
        UiApp.FileType.SPREADSHEETS, "spreadsheetSelectionHandler");
  spreadsheetDocPicker.showDocsPicker();
  return app;
}

function spreadsheetSelectionHandler(e) {
  var app = UiApp.getActiveApplication();
  UserProperties.setProperty("spreadsheetId", e.parameter.items[0].id);
  selectedSpreadsheetId = e.parameter.items[0].id;
  Logger.log("Selected spreadsheet: " + selectedSpreadsheetId);
  doMerge();
  return app;
}

function doMerge() {
  var selectedSpreadsheetId = UserProperties.getProperty("spreadsheetId");
  var selectedTemplateId = UserProperties.getProperty("templateId");
  Logger.log("Selected spreadsheet: " + selectedSpreadsheetId);
  var sheet = SpreadsheetApp.openById(selectedSpreadsheetId);
  Logger.log("Spreadsheet opened");
  Logger.log("Opening template: " + selectedTemplateId);
  var template = DocumentApp.openById(selectedTemplateId);
  Logger.log("Template opened");
  var templateFile = DocsList.getFileById(selectedTemplateId);
  var templateDoc = DocumentApp.openById(templateFile.getId());
  //var mergedFile = templateFile.makeCopy();
  var mergedDoc = DocumentApp.create("Result of mail merge");
  var bodyCopy = templateDoc.getActiveSection().copy();
  Logger.log("Copy made");
  var rows = sheet.getDataRange();
  var numRows = rows.getNumRows();
  var values = rows.getValues();
  var fieldNames = values[0];

  for (var i = 1; i < numRows; i++) {
    var row = values[i];
    Logger.log("Processing row " + i + " " + row);
    var body = bodyCopy.copy();
    for (var f = 0; f < fieldNames.length; f++) {
      Logger.log("Processing field " + f + " " + fieldNames[f]);
      Logger.log("Replacing [" + fieldNames[f] + "] with " + row[f]);
      body.replaceText("\\[" + fieldNames[f] + "\\]", row[f]);
    }
    var numChildren = body.getNumChildren();
    for (var c = 0; c < numChildren; c++) {
      var child = body.getChild(c);
      child = child.copy();
      if (child.getType() == DocumentApp.ElementType.HORIZONTALRULE) {
        mergedDoc.appendHorizontalRule(child);
      } else if (child.getType() == DocumentApp.ElementType.INLINEIMAGE) {
        mergedDoc.appendImage(child);
      } else if (child.getType() == DocumentApp.ElementType.PARAGRAPH) {
        mergedDoc.appendParagraph(child);
      } else if (child.getType() == DocumentApp.ElementType.LISTITEM) {
        mergedDoc.appendListItem(child);
      } else if (child.getType() == DocumentApp.ElementType.TABLE) {
        mergedDoc.appendTable(child);
      } else {
        Logger.log("Unknown element type: " + child);
      }
   }
   Logger.log("Appending page break");
   mergedDoc.appendPageBreak();
   Logger.log("Result is now " + mergedDoc.getActiveSection().getText());
  }
}

function testMerge() {
  UserProperties.setProperty("templateId", 
    "1pAXWE0uklZ8z-O_Tejuv3pWSTiSv583ptUTGPt2Knm8");
  UserProperties.setProperty("spreadsheetId", 
    "0Avea1NXBTibYdFo5QkZzWWlMYUhkclNSaFpRWUZOTUE");
  doMerge();
}


function doGet() {
  return mailMerge();
}

1
আপনি কেন একটি স্ট্যান্ড-এ-লোন অ্যাপ্লিকেশন বেছে নেওয়া পছন্দ করেছেন এবং স্প্রেডশিটের মধ্যে থেকে কোনও বিল্ড নয়? এটি ওপির পক্ষে এটি আরও সহজ করে তুলবে। দ্বিতীয়ত, স্ক্রিপ্টে এত লগার কল কেন? এটি স্ক্রিপ্টকে অতিরিক্ত ঘন করে তুলবে।
জ্যাকব জানু টিনস্ট্রা

গুগল স্ক্রিপ্ট সংরক্ষণাগারটিতে কিছু প্রাক-নির্মিত স্ক্রিপ্ট ব্যবহৃত হত ... কোনও বিশেষ কারণ আছে যা আপনার বা অন্য কোনও সেখানে আপলোড হবে না?
ব্রাইস

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

5
ভিদার এটি একটি দুর্দান্ত উত্তর। আমি এটি পরিষ্কার করে দিয়েছি, এবং কিছু অবহিত পদ্ধতি আপডেট করেছি এবং অপ্রয়োজনীয় ফাংশন থেকে মুক্তি পেয়েছি এবং @ জ্যাকবজানটুইনস্ট্রার পরামর্শ অনুসারে এটিকে স্প্রেডশিটের মধ্যে থেকে চালানোর জন্যও এটি পরিবর্তন করেছি। তারপরে আমি বুঝতে পারি যে এখানে একটি ত্রুটি রয়েছে যা চিত্রগুলি ভেঙে ফেলেছে এবং আমি বাগের জন্য কাজও করেছি। আমি অনুভব করি যে এখন গিথুবকে দেওয়া যথেষ্ট ভালো।আমি এটি সেখানে পোস্ট করেছি এবং এতে আপনার কাজের প্রতিক্রিয়া হিসাবে আপনার প্রতিক্রিয়াটির একটি লিঙ্ক সরবরাহ করেছি।
hadi

@ হাদি ভাল কাজ!
ভিদার এস রামদল

6

নতুন গুগল ড্রাইভ অ্যাড-অনগুলির মাধ্যমে , "তবুও অন্য মেল মার্জ" এর মতো কয়েকটি মেল মার্জ সম্ভাবনা উপলব্ধ।

এটি ব্যবহার করতে, আপনার অবশ্যই একটি "নতুন" গুগল স্প্রেডশিট থাকা উচিত এবং অ্যাড অনগুলি মেনুটির মাধ্যমে অ্যাড-অন ইনস্টল করতে হবে:

গুগল স্প্রেডশিট থেকে স্ক্রিনশট

অনুসন্ধান করুন Mail mergeএবং আপনি বেশ কয়েকটি বিকল্প পাবেন।


নোট করুন এটি প্রতিদিন 100 ইমেলের মধ্যে সীমাবদ্ধ (বিনামূল্যে)।
পিক্সলাইন

5

গুগলের নিজস্ব পোস্টে গুগল স্প্রেডশিট + গুগল ডক্সের পরিবর্তে কীভাবে এক শীটে ফিড ডেটা এবং অন্যটিতে টেমপ্লেট সেট আপ করতে হয় তা ব্যাখ্যা করে: https://developers.google.com/apps-script/articles/mail_ विसর

তবে শেষ ফলাফলটি MailAppপছন্দসই "ক্লোনড" ডকুমেন্টের চেয়ে ইমেল প্রেরণের জন্য । আমি টিউটোরিয়াল এবং @ বিদারের উত্তর একত্রিত করার পরামর্শ দেব, প্রতিস্থাপনের রেখাগুলির সাথে এমন কিছু:

MailApp.sendEmail(rowData.emailAddress, emailSubject, emailText);

সঙ্গে

var mergedDoc, bodyContent,
    // you'd have to make the DocumentTitle column for the following
    newTitle = rowData.DocumentTitle /* or set to a static title, etc */;

// make a copy of the template document -- see http://stackoverflow.com/a/13243070/1037948
// or start a new one if you aren't using the template, but rather text from a template field
if( usingTemplateFile ) {
    mergedDoc = templateDoc.makeCopy(newTitle)
    bodyContent = mergedDoc.getBody();
} else {
    mergedDoc = DocumentApp.create(newTitle);
    bodyContent = mergedDoc.getBody();
    bodyContent.setText(templateFieldContents);
}

// tweak the fillInTemplateFromObject to accept a document Body and use .replaceText() instead of .match as in mailmerge example
// .replaceText see https://developers.google.com/apps-script/reference/document/body#replaceText(String,String)
fillInTemplateFromObject(bodyContent, rowData);

// no append needed?

র্যান্ডম অ্যাপস্ক্রিপ্ট উল্লেখ:


কেবল এই জিআইএসটি জুড়ে দৌড়ে এসেছিলেন gist.github.com/mhawksey/1170597
ড্রাজাস

3
প্রশ্নটি বিশেষত ইমেল মেল মার্জটিকে বাদ দেয়।
ব্রাইস

3

আমি অটোক্র্যাট সুপারিশ করি । আপনাকে মার্জ সেট আপ করতে সহায়তা করার জন্য এটি একটি দুর্দান্ত উইজার্ড-মত ইন্টারফেস সহ একটি গুগল অ্যাড-অন।


1

আমার একই সমস্যা ছিল এবং এটি ভিদার উত্তর দিয়ে সমাধান করার চেষ্টা করেছি তবে অবমূল্যায়নের কারণে এটি কার্যকর হয়নি।

আসল সমাধানটি ভিডারের উত্তরের মন্তব্যে @ হাদি দ্বারা লিঙ্ক।

বিদার :
এটি দুর্দান্ত উত্তর। আমি এটি পরিষ্কার করে দিয়েছি, এবং কিছু অবহেলিত পদ্ধতি আপডেট করেছি এবং অপ্রয়োজনীয় ফাংশন থেকে মুক্তি পেয়েছি এবং @ জ্যাকব্যাজানটুইনস্ট্রার পরামর্শ অনুসারে এটিকে স্প্রেডশিটের মধ্যে থেকে চালানোর জন্যও এটি সংশোধন করেছি তারপরে আমি বুঝতে পারি যে এখানে একটি ত্রুটি রয়েছে যা চিত্রগুলি ভেঙে ফেলেছে এবং আমি বাগের জন্য কাজও করেছি। আমি অনুভব করি যে এখন গিথুবকে দেওয়া যথেষ্ট ভালো। আমি এটি সেখানে পোস্ট করেছি এবং এতে আপনার কাজের প্রতিক্রিয়া হিসাবে আপনার প্রতিক্রিয়াটির একটি লিঙ্ক সরবরাহ করেছি।
- হাদী মার্চ 4 '15 এ 19:24 "

https://github.com/hadaf/SetetsToDocsMerge :

  A Google Apps Script that merges information from a Google Sheet into a 
  Template created by Google Docs. The result is a new Google Docs file 
  that is populated by the Sheet data.

কেবলমাত্র পদক্ষেপগুলি অনুসরণ করেছে Readmeএবং আমি একটি টেমপ্লেট গুগল-ডক এবং একটি গুগল-শিট থেকে মার্জ করা ডকুমেন্ট তৈরি করতে সক্ষম হয়েছি।

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