Слияние с полем группового ключа из баз данных Excel или SQL

Я искал в Интернете, чтобы найти решение, но до сих пор не увенчался успехом. Я имею промежуточные навыки в VBA и 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 to Outlook и с использованием таблицы Excel с небольшой манекеном. Я нашел этот https://support.microsoft.com/en-us/kb/294686 , но я не могу заставить его делать то, что он должен делать.

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

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

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

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

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

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

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

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

Самое сложное, что у нас было, это добавить подпись с помощью LOGO, но мы решили ее совместно использовать функцию 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, и я отправил 1000 писем ежедневно без проблем.

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

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

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

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

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

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

 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 может быть столько столбцов, сколько хотите, с одной строкой заголовка (заморожено в порядке) и двумя столбцами в самом конце. Последний столбец – URL, второй – последний (Check) (где отображаются цвета фона фона).

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

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

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

  • Обновите раздел строки подключения, но не всю строку
  • Не удалось подключиться к источнику с помощью диспетчера подключений, объединенных ячеек
  • Можно ли перенести результаты MS SQL в новый файл MS Excel?
  • Импорт данных в Excel из таблицы доступа, ошибка синтаксиса в разделе FROM
  • Использовать ячейку excel в строке запроса SQL (функция)
  • как вы можете проанализировать файл excel (.xls), хранящийся в varbinary в MS SQL 2005?
  • Функция Excel Microsoft Query для извлечения имени пользователя
  • Получить целую строку с помощью jdbc в виде списка
  • HTML-таблица для Excel-файла
  • SQL Server не может загрузить файл excel
  • Эквивалент перетаскивания в Excel, но в запросе Access
  • Interesting Posts

    Проверьте, обновлен ли рабочий лист перед запуском макроса в VBA

    Фильтры Excel не отображаются после импорта в SharePoint

    Падение данных в стандартной форме excel

    Вставить данные из Excel в Word

    c # – Могу ли я сохранить формат для ячеек при копировании excel-листов с помощью Microsoft.Office.Interop.Excel?

    Как извлекать и рисовать только минимальные и максимальные пики массива, -графический анализ. С Matlab или excel

    SHAPE, вставленный в ячейку, препятствует выбору ячейки

    Экспорт таблицы с повторителем в Excel

    Вызов OLEDBConnection.Refreshing в цикле предотвращает завершение обновления соединения

    Можно ли копировать отдельные значения или целые строки непосредственно между массивами Excel VBA?

    Не работает, когда я снова выбираю один и тот же файл: индекс был вне границ ошибки массива любая идея

    выбирать и извлекать конкретные как часть строки в ячейке excel

    vba отправлять электронную почту и печатать в формате pdf и сохранять в папку?

    Команда SaveAs не работает, но SaveCopyAs делает

    ProgrammingError: не может адаптировать тип 'set'

    Давайте будем гением компьютера.