मैं Google स्प्रेडशीट से Google दस्तावेज़ में मर्ज कैसे करूँ?


20

Microsoft Excel और Microsoft Word के साथ, किसी स्प्रेडशीट से पंक्तियों को किसी वर्ड फ़ाइल में पृष्ठों में मर्ज करना आसान है। यह परंपरागत रूप से पेपर मेलिंग बनाने के लिए उपयोग किया जाता था। मैं Google ड्राइव / Google डॉक्स के साथ कैसे कर सकता हूं?

स्प्रेडशीट-टू-ईमेल मेल मर्ज की पेशकश करने वाले बहुत सारे टेम्प्लेट हैं: मैं जीमेल के साथ मेल मर्ज कैसे करूं? लेकिन यह नहीं है कि मैं क्या कर रहा हूँ।


क्या आपने कॉपी / पेस्ट करने की कोशिश की है?
याकूब जान टुंस्ट्रा

4
10,000 पंक्तियों के लिए कॉपी / पेस्ट करें? जी नहीं, धन्यवाद। वर्ड / एक्सेल ठीक काम करेगा।
ब्रायस

जवाबों:


8

इसके लिए आपको एक Google Apps Script लिखनी होगी । आप स्प्रेडशीट की पहली पंक्ति को फ़ील्ड नाम दे सकते हैं, और एक टेम्प्लेट दस्तावेज़ बना सकते हैं, जहाँ फ़ील्ड को संदर्भित किया जाता है [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
आपने एक स्टैंड-ए-लोन ऐप का उपयोग करने के लिए क्यों चुना और स्प्रेडशीट के भीतर से एक का निर्माण नहीं किया? इससे ओपी को काफी आसानी होगी। दूसरी बात, स्क्रिप्ट में इतने सारे लॉगर कॉल क्यों हैं? यह स्क्रिप्ट को अत्यधिक सघन बना देगा।
याकूब जान टुंस्ट्रा

Google स्क्रिप्ट संग्रह में कुछ पूर्व-निर्मित स्क्रिप्ट हुआ करती थीं ... क्या कोई विशेष कारण है आपका या कोई अन्य वहाँ अपलोड नहीं किया जाएगा?
ब्राइस

जैकब की टिप्पणी पर अब तक गौर नहीं किया है, और जैसा कि वह कहते हैं, यह शायद स्टैंडअलोन के बजाय एक स्प्रेडशीट स्क्रिप्ट होना चाहिए। मैं देखूंगा कि क्या मुझे इस पर काम करने का समय मिल सकता है, और इसे स्क्रिप्ट गैलरी में सबमिट कर सकता हूं।
विदर्भ एस। रामदल

5
Vidar यह एक महान जवाब है। मैंने इसे साफ किया, और कुछ हटाए गए तरीकों को अपडेट किया, और अनावश्यक कार्यों से छुटकारा पाया, और इसे संशोधित भी किया कि इसे स्प्रैडशीट के भीतर से चलाया जाए जैसा कि @JacobJanTuinstra ने सुझाव दिया था। तब मुझे एहसास हुआ कि एक बग है जो छवियों को तोड़ता है , और मैंने बग के लिए एक वर्कअराउंड भी बनाया है। मुझे लगता है कि अब जीथब पर डाल दिया जाना अच्छा है। मैंने इसे वहां पोस्ट किया है और इसमें काम के शुरुआती संस्करण के रूप में आपकी प्रतिक्रिया का लिंक दिया है।
हदी

@ खादी अच्छी नौकरी!
विदर्भ एस। रामदल

6

नए Google ड्राइव ऐड-ऑन के माध्यम से , "मेल अदर मेल मर्ज" जैसे कई मेल मर्ज संभावनाएं उपलब्ध हैं।

इसका उपयोग करने के लिए, आपके पास "नया" Google स्प्रेडशीट होना चाहिए, और ऐड ऑन मेनू के माध्यम से ऐड-ऑन स्थापित करें:

Google स्प्रेडशीट से स्क्रीनशॉट

के लिए खोजें Mail merge, और आपको कई विकल्प मिलेंगे।


ध्यान दें कि यह प्रति दिन (मुफ्त में) 100 ईमेल तक सीमित है।
Pixline

5

Google की अपनी पोस्ट बताती है कि Google स्प्रैडशीट + Google Doc: https://developers.google.com/apps-script/articles/mail_merge के बजाय एक शीट में फ़ीड डेटा और दूसरे में टेम्पलेट कैसे सेट करें

हालांकि, अंतिम परिणाम MailAppवांछित "क्लोन" दस्तावेज़ के बजाय एक ईमेल भेजने के लिए है। मैं ट्यूटोरियल और @ Vidar के उत्तर के संयोजन का सुझाव दूंगा, जो कि बदलने की तर्ज पर कुछ है:

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 को एक और उदाहरण के रूप में चलाया। gist.github.com/mhawksey/1170597
drzaus

3
प्रश्न विशेष रूप से ईमेल मेल मर्ज को बाहर करता है।
ब्राइस

3

मैं ऑटोक्राट की सलाह देता हूं । यह एक Google ऐड-ऑन है जिसमें एक उत्कृष्ट विज़ार्ड जैसा इंटरफ़ेस है जिसकी मदद से आप मर्ज सेट कर सकते हैं।


1

मेरे पास एक ही मुद्दा था और इसे विडार के उत्तर के साथ हल करने की कोशिश की गई, लेकिन पदावनति के कारण यह काम नहीं किया।

विदर्भ के उत्तर पर टिप्पणी में वास्तविक समाधान @ खादी द्वारा लिंक है।

विदर्भ :
यह एक महान जवाब है। मैंने इसे साफ किया, और कुछ हटाए गए तरीकों को अपडेट किया, और अनावश्यक कार्यों से छुटकारा पाया, और साथ ही इसे स्प्रैडशीट के भीतर से चलाने के लिए संशोधित किया जैसा कि @ याकूबजैनटिस्ट्रा ने सुझाव दिया था। तब मुझे एहसास हुआ कि एक बग है जो छवियों को तोड़ता है, और मैंने बग के लिए एक वर्कअराउंड भी बनाया है। मुझे लगता है कि अब जीथब पर डाल दिया जाना अच्छा है। मैंने इसे वहां पोस्ट किया है और इसमें काम के शुरुआती संस्करण के रूप में आपकी प्रतिक्रिया का लिंक दिया है।
- हदी मर 4 '15 को 19:24 "

https://github.com/hadaf/SheetsToDocsMerge :

  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और मैं एक टेम्पलेट से एक मर्ज किए गए दस्तावेज़ को बनाने में सक्षम था Google-डॉक और Google-शीट।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.