2016-08-15 10 views
0

Я искал в Интернете, чтобы найти решение, но до сих пор не увенчалось успехом. Я имею промежуточные навыки в VBA и SQL, но не смог создать то, что мне нужно.Слияние писем с полем группировки ключей из баз данных Excel или SQL

У меня есть база данных со следующей информацией.

Co.Name |Email  | Product | Q | 
    SH1 |[email protected] | Orange | 105.566 | 
    SH1 |[email protected] | Berries | 200.000 | 
    BT1 |[email protected] | Orange | 300.000 | 
    BT4 |[email protected] | Apple | 101.700 | 
    WT1 |[email protected] | Berries | 201.040 | 
    WT6 |[email protected] | Apple | 204.000 | 

Название компании относится к Company_Name и Q для количества.

Мне нужно слияние, которое вставляет эксклюзивную таблицу, используя поле ключа для формирования таблицы.

В таблице фиктивных данных прежде всего ключевым полем может быть название компании или письмо компании.

**Email** 
To: <emailcompany1> 
Subject: Enquiry of <productname1>, <productname2>, ..., <productnamei> 

Dear sirs from <company_name1> 

In name of StackOverflow Inc, I'm requesting a price quotation and 
availability of the following products so we can feed this huge 
and awesome online community: 

!-- Here it has to insert an specific table for the company name 
!-- so it only shows the information regarding that company.! 

Table<CompanyName1> 
| Product  | Q  | 
| Product 1 | Q. Prod 1 | 
| Product 2 | Q. Prod 2 | 
| Product ... | Q. Prod ...| 
| Product i | Q. Prod i | 


Regards 
StackOverflow Supply Manager 
<end mail, and repeat for other company, 
until there are no more companies..> 

Я пытался сделать это с помощью Word Mail Merge для Outlook, и используя таблицу Excel с небольшой фиктивной базы данных. Я нашел это https://support.microsoft.com/en-us/kb/294686, но я не могу заставить его делать то, что он должен делать.

EDIT: Я был частично успешным с https://support.microsoft.com/en-us/kb/294686. В настоящее время у меня проблемы с форматированием таблицы. Если я поставил таблицу как 2x2, и есть 4 продукта, она перестанет работать.

У меня есть большая база данных с различными точками данных и переменными, которые потребуют много писем. Мне нужна система, которая может обрабатывать эту нагрузку.

Чтобы уточнить: мне нужно слить почту и вставить конкретную таблицу относительно поля ключа ** (в фиктивном случае ключевым поле является имя компании или company_email).

Я свободно говорю с SQL-запросами и использую Microsoft SQL Server, но я не смог его решить в Excel, поэтому пока не хочу использовать SQL-соединения. База данных в настоящее время находится в SQL, и у меня есть доступ к SQL, Excel, Access, приложениям Google (Gmail в офисе) и т. Д.

Если есть платная программа для нее или какой-то макрос, я могу поговорить с мой босс, чтобы посмотреть, можем ли мы его купить. Все быстрее, чем отправка писем один за другим.

+1

, когда вы говорите, что не можете заставить его работать, что означает что? Каков ваш конкретный камень преткновения? Из документа, на который вы ссылаетесь, выглядит достаточно очевидно, что либо ваше имя, либо адрес электронной почты могут быть вашим ключевым полем. Тогда кажется, что вы просто ссылаетесь на товар и Q столбцов в нужном вам формате, и он должен работать ... – Matt

+0

Человек, я думаю, вы только что помогли мне A LOT После вашего вопроса я начал обновлять свое сообщение, объясняя, почему не работал, затем, читая снова документ microsoft, я заметил, что он сказал, что ему нужно активировать режим DIRECTORY (что бы это ни значило) Теперь, активировав режим каталога, введите код на странице https://support.microsoft. com/en-us/kb/294686. Я буду держать его как нераскрытый, пока я не проверю завтра, если можно дать правильный формат, который я хочу (потому что у меня много других столбцов, поэтому могут быть проблемы). Но еще раз спасибо – HendrixSpirit

ответ

1

Перепробовав различные подходы (Fmtp сервер компании, Google сценария, макросы), я решил, что это из моей лиги, и я заключил контракт с экспертом по по фрилансер .com

Программист сделал код VBA, который использует файл excel в качестве базы данных на одном листе, а второй - для шаблона электронной почты.

Затем он соединяется с внешним видом и отправляет сообщение. Таблица добавляется через HTML в Outlook.

Самая трудная часть, которую мы имели добавлял подпись с логотипом, но мы решили, что вместе с использованием функции GetBoiler на VBA:

Function GetBoiler(ByVal sFile As String) As String 
'Dick Kusleika 
Dim fso As Object 
Dim ts As Object 
Set fso = CreateObject("Scripting.FileSystemObject") 
Set ts = fso.GetFile(sFile).OpenAsTextStream(1, -2) 
GetBoiler = ts.ReadAll 
ts.Close 
End Function 

Signature 
SigString = Environ("appdata") & "\Microsoft\Signatures\test_mailing.htm 
'change_text_mailing.htm with correct path 

If Dir(SigString) <> "" Then 
Signature = GetBoiler(SigString) 
Else 
Signature = "" 
End If 

В конце концов, мне это стоило 100 долларов, чтобы сделать программу, это полностью costumizable, и я отправил 1.000 + почты ежедневно без проблем.

Единственная небольшая проблема с этим подходом заключается в том, что GMAIL не читает HTML-код должным образом, поэтому при отправке почты кому-то, который открывает ее на GMAIL, таблица плохо отображается без формата, хотя это выглядит в MS Outlook , Hotmail, Yahoo, формат таблицы в порядке

Для решения этой проблемы мы решили, что в электронном письме она также содержит ту же таблицу, что и приложение на .xlsx.

Я знаю, что я не даю полного ответа, но это стоило мне денег и много недель работы в свободное время. Полный ответ включает большую программу с макросом VBA из 5.000 + строк и пользовательских форм, это не просто кусок кода, как я думал.

Я пишу это, чтобы сказать, ЭТО ВОЗМОЖНО сделать это с помощью VBA, используя Excel и Outlook. Как я это сделал.

0

Если вы хотите создать это в Google Apps Script, как указывает тег вашего сообщения, вы можете использовать приведенный ниже код. Код будет использовать информацию в Листе Google для создания персонализированного элемента из шаблона. Это потребует перемещения вашей базы данных в среду Google и обучения, если у вас еще нет, базового JavaScript.

Код, который я написал для своих целей, использует форму Google для сбора данных, лист Google с двумя дополнительными столбцами, называемыми «Проверить» и «URL», шаблон HTML и подготовленный документ Google шаблон. Я расскажу об изменениях, которые могут иметь отношение к вам после кода.

function mergeApplication() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName("Sheet Where Form Data is Processed"); 
    var formSheet = ss.getSheetByName("Form Responses"); 
    var lastRow = formSheet.getLastRow(); 
    var lastColumn = sheet.getMaxColumns(); 
    function checkAndComplete() { 
    var urlColumn = lastColumn; //Provides a direct link to the file created 
    var checkColumn = (urlColumn - 1); 
    var checkRange = sheet.getRange(2, checkColumn, (lastRow - 1), 1); 
    var check = checkRange.getBackgrounds(); //This shows status of the code 
    var red = "#ff0404"; 
    var yellow = "#ffec0a"; 
    var green = "#3bec3b"; 
    for (var i = 0; i < check.length; i++) { 
     if (check[i] == green) { 
     continue; 
     } else { 
     var statusCell = sheet.getRange((i+2), checkColumn, 1, 1); 
     var urlCell = sheet.getRange((i+2), urlColumn, 1, 1); 
     var dataRow = sheet.getRange((i+2), 1, 1, (lastColumn - 2)); 
     function mergeTasks() {  
      function docCreator() { 
      var docTemplate1 = DriveApp.getFileById("templateId1"); //allows for if statements to determine which template is needed 
      //var docTemplate2 = DriveApp.getFileById("templateId2"); 
      var folderDestination1 = DriveApp.getFolderById("folderId1"); 
      var folderDestination2 = DriveApp.getFolderById("folderId2"); 
      if (condition1 == met) { 
       var docToUse = docTemplate1; 
       var folderDestination = folderDestination1   
       var emailTemplate = HtmlService.createHtmlOutputFromFile("Email Template 1").getContent(); 
      } else if (condition2 == met) { 
       var docToUse = docTemplate2; 
       var folderDestination = folderDestination2 
       var emailTemplate = HtmlService.createHtmlOutputFromFile("Email Template 2").getContent(); 
      } 
      var docName = "Name - " + variable + "string"; 
      var docCopy = docToUse.makeCopy(docName, folderDestination); 
      var docId = docCopy.getId(); 
      var docURL = DriveApp.getFileById(docId).getUrl(); 
      var docToSend = DriveApp.getFileById(docId); 
      var docInUse = DocumentApp.openById(docId); 
      var docBody = docInUse.getBody(); 
      var docText = docBody.getText(); 
      function tagReplace() { 
       var taggedArray = docText.match(/\<{2}[\w\d\S]+\>{2}/g); 
       var headerArray = sheet.getRange(1, 1, 1, (lastColumn - 2)).getValues(); 
       var dataArray = dataRow.getValues(); 
       var strippedArray = []; 
       function tagStrip() { 
       for (var t = 0; t < taggedArray.length; t++) { 
        strippedArray.push(taggedArray[t].toString().slice(2, -2)); 
       } 
       } 
       function dataMatch() { 
       for (var s = 0; s < strippedArray.length; s++) { 
        for (var h = 0; h < headerArray[0].length; h++) { 
        if (strippedArray[s] == headerArray[0][h]) { 
         docBody.replaceText(taggedArray[s], dataArray[0][h]); 
        } 
        } 
       } 
       docInUse.saveAndClose(); 
       } 
       tagStrip(); 
       dataMatch(); 
      }   
      function emailCreator() { 
       var emailTag = "[email protected]"; 
       var bodyAddition = '<table style="border:1px; padding:15px; background-color:#DDDDDD"><tr><td> This is an HTML additive:</td><td><a href = "' + docURL + '">' + docName + '</a></td></tr></table><br /><br />'; 
       var emailBody = emailTemplate + bodyAddition; 
       var emailSubject = "New Email " + docName + " string" 
       MailApp.sendEmail({ 
       to: emailTag, 
       subject: emailSubject, 
       htmlBody: emailBody, 
       }); 
      } 
      tagReplace(); 
      statusCell.setBackground(yellow); 
      emailCreator(); 
      urlCell.setValue(docURL); 
      } 
      statusCell.setBackground(red); 
      docCreator(); 
      statusCell.setBackground(green); 
     } 
     mergeTasks(); 
     } 
    } 
    } 
    checkAndComplete(); 
} 

Для этого, ваш лист Google может иметь столько столбцов, сколько вы хотите, с одной строкой заголовка (заморожен в порядке), и 2 колонки в самом конце. Последний столбец - URL, второй - последний (Check) (где отображаются цвета фона фона).

Ваш Google Doc может быть записан/отформатирован, однако вы хотите, но места, которые нужно заменить данными из вашего листа, будут помечены с помощью <<>>; например, <<staffName>>. Этот тег (расположенный и замененный с помощью RegEx) должен соответствовать заголовку столбца, в котором находятся данные.Например, если столбец 3 имеет имя и называется PersonName в первой ячейке, используйте тег <<PersonName>>.

GAS позволяет создавать файлы HTML, и они могут быть записаны как сложные/голые, как вы пожелаете, и их можно модифицировать с помощью GAS-кода на лету. Как вы описали, вы хотите заменить теги в письме данными. Вы можете сделать это с помощью аналогичных средств для замены тегов в Google Doc. Вы можете найти дополнительную информацию в справочной системе GAS для методов почты here и методы HTML here.

Этот код не имеет ограничителя строк. Может быть время/# вызовов, которые GAS разрешает за один проход кода. Если это так, вы можете просто вызвать функцию с помощью триггера времени, и он будет просто запускаться снова с интервалом времени, откуда бы он ни остановился.

+0

Спасибо, я очень занят на работе, он выглядит очень аккуратно. Я проверю его на выходных и отвечу.Я никогда не работал с Google Script, но я думаю, что смогу это сделать, если ядро ​​кода уже написано, и это то, что вы мне предоставляете. – HendrixSpirit