Я пытаюсь добавить динамический список рассылки в электронное письмо, которое отправляю с помощью приложения логики. Он срабатывает всякий раз, когда большой двоичный объект загружается в контейнер, за которым он наблюдает.
Возможно ли:
Например, если CSV должен быть составлен следующим образом:
+----+---------+---------+---------+--------------------+
| ID | Column1 | Column2 | Column3 | Distribution List |
+----+---------+---------+---------+--------------------+
| 1 | 500 | R | 500 | [email protected] |
+----+---------+---------+---------+--------------------+
| 2 | 600 | R | 600 | [email protected] |
+----+---------+---------+---------+--------------------+
| 3 | 700 | DED | NULL | [email protected] |
+----+---------+---------+---------+--------------------+
Мне нужно, чтобы значение в столбце списка рассылки перешло сюда:
Список рассылки будет существовать только для создания электронного письма. Есть ли способ удалить его до присоединения содержимого большого двоичного объекта?
Обновлено: Схема Parse_JSON:
{
"type": "array",
"items": {
"type": "object",
"properties": {
"ID": {
"type": "string"
},
"Column1": {
"type": "string"
},
"Column2": {
"type": "string"
},
"Column3": {
"type": "string"
},
"DistributionList": {
"type": "string"
}
},
"required": [
"ID",
"Column1",
"Column2",
"Column3",
"DistributionList"
]
}
}
Я использовал данный рабочий процесс для передачи имени списка рассылки в электронном письме, а затем удалил столбец, прежде чем прикрепить его к электронному письму.
Я использовал приведенный ниже код JavaScript для анализа данных CSV в JSON.
Проанализировал массив JSON, затем использовал действие «Выбрать» для получения необходимых столбцов и, наконец, использовал действие «Создать таблицу CSV» для формирования таблицы CSV, которая будет использоваться в качестве вложения к электронному письму.
const csvData = workflowContext.actions.Get_blob_content_V2.outputs.body; // Blob content as a string
const lines = csvData.trim().split('\n');
const result = [];
if (lines.length === 0) {
return result;
}
const headers = lines[0].split(',').map(header => header.trim());
for (let i = 1; i < lines.length; i++) {
const obj = {};
const currentLine = lines[i].split(',').map(field => field.trim());
for (let j = 0; j < headers.length; j++) {
obj[headers[j]] = currentLine[j];
}
result.push(obj);
}
return result;
Код-
{
"definition": {
"$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
"actions": {
"Create_CSV_table": {
"inputs": {
"format": "CSV",
"from": "@body('Select')"
},
"runAfter": {
"Select": [
"Succeeded"
]
},
"type": "Table"
},
"Execute_JavaScript_Code": {
"inputs": {
"code": "const csvData = workflowContext.actions.Get_blob_content_V2.outputs.body; // Blob content as a string\r\n\r\n\r\nconst lines = csvData.trim().split('\\n');\r\nconst result = [];\r\n\r\nif (lines.length === 0) {\r\n return result; \r\n}\r\n\r\nconst headers = lines[0].split(',').map(header => header.trim());\r\n\r\nfor (let i = 1; i < lines.length; i++) {\r\n const obj = {};\r\n const currentLine = lines[i].split(',').map(field => field.trim());\r\n\r\n for (let j = 0; j < headers.length; j++) {\r\n obj[headers[j]] = currentLine[j];\r\n }\r\n result.push(obj);\r\n}\r\n\r\nreturn result;\r\n"
},
"runAfter": {
"Get_blob_content_V2": [
"Succeeded"
]
},
"type": "JavaScriptCode"
},
"For_each": {
"actions": {
"Send_an_email_(V2)": {
"inputs": {
"body": {
"Attachments": [
{
"ContentBytes": "@{base64(body('Create_CSV_table'))}",
"Name": "@triggerBody()?['Name']"
}
],
"Body": "<p class=\"editor-paragraph\">Test Email.....</p>",
"Importance": "Normal",
"Subject": "CSV file",
"To": "@items('For_each')['Distribution List']"
},
"host": {
"connection": {
"name": "@parameters('$connections')['outlook']['connectionId']"
}
},
"method": "post",
"path": "/v2/Mail"
},
"type": "ApiConnection"
}
},
"foreach": "@outputs('Parse_JSON')['body']",
"runAfter": {
"Create_CSV_table": [
"Succeeded"
]
},
"type": "Foreach"
},
"Get_blob_content_V2": {
"inputs": {
"host": {
"connection": {
"name": "@parameters('$connections')['azureblob']['connectionId']"
}
},
"method": "get",
"path": "/v2/datasets/@{encodeURIComponent(encodeURIComponent('AccountNameFromSettings'))}/files/@{encodeURIComponent(encodeURIComponent(triggerBody()?['Path']))}/content",
"queries": {
"inferContentType": true
}
},
"metadata": {
"JTJmdGVzdCUyZlRlc3QxMi5jc3Y = ": "/test/Test12.csv"
},
"runAfter": {},
"type": "ApiConnection"
},
"Parse_JSON": {
"inputs": {
"content": "@outputs('Execute_JavaScript_Code')?['body']",
"schema": {
"items": {
"properties": {
"Column1": {
"type": "string"
},
"Column2": {
"type": "string"
},
"Column3": {
"type": "string"
},
"Distribution List": {
"type": "string"
},
"ID": {
"type": "string"
}
},
"required": [
"ID",
"Column1",
"Column2",
"Column3",
"Distribution List"
],
"type": "object"
},
"type": "array"
}
},
"runAfter": {
"Execute_JavaScript_Code": [
"Succeeded"
]
},
"type": "ParseJson"
},
"Select": {
"inputs": {
"from": "@outputs('Execute_JavaScript_Code')?['body']",
"select": {
"Column1": "@item()?['Column1']",
"Column2": "@item()?['Column2']",
"Column3": "@item()?['Column3']",
"ID": "@item()?['ID']"
}
},
"runAfter": {
"Parse_JSON": [
"Succeeded"
]
},
"type": "Select"
}
},
"contentVersion": "1.0.0.0",
"outputs": {},
"parameters": {
"$connections": {
"defaultValue": {},
"type": "Object"
}
},
"triggers": {
"When_a_blob_is_added_or_modified_(properties_only)_(V2)": {
"evaluatedRecurrence": {
"frequency": "Second",
"interval": 10
},
"inputs": {
"host": {
"connection": {
"name": "@parameters('$connections')['azureblob']['connectionId']"
}
},
"method": "get",
"path": "/v2/datasets/@{encodeURIComponent(encodeURIComponent('AccountNameFromSettings'))}/triggers/batch/onupdatedfile",
"queries": {
"checkBothCreatedAndModifiedDateTime": false,
"folderId": "JTJmdGVzdA= = ",
"maxFileCount": 10
}
},
"metadata": {
"JTJmdGVzdA= = ": "/test"
},
"recurrence": {
"frequency": "Second",
"interval": 10
},
"splitOn": "@triggerBody()",
"type": "ApiConnection"
}
}
},
"parameters": {
"$connections": {
"value": {
"azureblob": {
"connectionId": "/subscriptions/0e8****b5e7c/resourceGroups/*****/providers/Microsoft.Web/connections/azureblob",
"connectionName": "azureblob",
"id": "/subscriptions/0e8*******5e7c/providers/Microsoft.Web/locations/northcentralus/managedApis/azureblob"
},
"outlook": {
"connectionId": "/subscriptions/0e8****b5e7c/resourceGroups/*****/providers/Microsoft.Web/connections/outlook",
"connectionName": "outlook",
"id": "/subscriptions/0e89*******8b5e7c/providers/Microsoft.Web/locations/northcentralus/managedApis/outlook"
}
}
}
}
}
Это дает мне ожидаемый ответ.
Спасибо за ваш ответ! Я хочу добиться этого таким образом, чтобы мне больше не требовалось вводить данные вручную, если бы CSV был структурирован по-другому, но всегда имел столбец «Список рассылки». Насколько я понимаю, для анализа JSON необходима схема, которую мне нужно будет сгенерировать. Достижимо ли то, о чем я прошу?
По какой-то причине я также получаю сообщение об ошибке ``` {"error":{"code":"InvalidTemplate","message":"Проверка шаблона не удалась: 'Действие(я) 'Get_blob_content_V2', на которое ссылается 'inputs' ' в действии 'Execute_JavaScript_Code' не определены в шаблоне.'"}} ``` хотя я сконструировал его аналогичным образом. Есть идеи, что здесь может пойти не так?
не обращайте внимания на предыдущую ошибку — приложение логики скомпилировано правильно. Хотя я получаю эту ошибку в действии «Разбор JSON» Unable to process template language expressions in action 'Parse_JSON' inputs at line '0' and column '0': 'The template language expression 'outputs('Execute_JavaScript_Code')?['body']' cannot be evaluated because property 'body' cannot be selected. Array elements can only be selected using an integer index. Please see https://aka.ms/logicexpressions for usage details.'.
@BlakeB9 Вам нужно добавить схему для действия Parse_JSON один раз для тела ввода. Пожалуйста, проверьте вывод, который вы получаете после выполнения действия javascript. На выходе должен быть массив тела
Я взял выходные данные действия javascript и сгенерировал схему в действии Parse_JSON, но все равно получаю ту же ошибку.
@BlakeB9 Поделитесь выводом действия JavaScript, а также снимком экрана действия Parse json с входными данными и схемой.
[ { "ID": "1", "Column1": "500", "Column2": "R", "Column3": "500", "DistributionList": "[email protected]" }, { "ID": "2", "Column1": "600", "Column2": "R", "Column3": "600", "DistributionList": "[email protected]" }, { "ID": "3", "Column1": "700", "Column2": "DED", "Column3": "NULL", "DistributionList": "[email protected]" } ]
Вот результат действия javascript
Вы должны получить выходные данные с параметром body из кода JavaScript. Используете ли вы workflowContext.actions.Get_blob_content_V2.outputs.body в JavaScript в качестве входных данных?
Да, я. Анализ json не показывает никаких входных данных (потому что похоже, что он не может получить входные данные из сообщения об ошибке). Я обновлю свой пост схемой. Слишком долго, чтобы писать сюда
Ах, поверьте, я это понял. Мне нужно было изменить содержимое/ввод на outputs('Execute_Javascript_Code')
, поэтому, по сути, уберите эту ?['body']
часть.
@BlakeB9 Рад, что это сработало для тебя
Да,
Это длинный вопрос, но вы можете достичь всего этого.
1. Вы можете получить электронное письмо из CSV и добавить его в электронное письмо. Вам просто нужно сначала проанализировать его в JSON. Вы можете использовать этот пример стратегии.
2. Вы можете исключить этот столбец при вложении к электронному письму, создав проанализированный CSV-файл. Вы можете сделать это с помощью этой стратегии. Передайте JSON соответствующих значений в этот соединитель. Вывод можно прикрепить к электронному письму как содержимое файла.
Спасибо за ваш ответ! Я хочу добиться этого таким образом, чтобы мне больше не требовалось вводить данные вручную, если бы CSV был структурирован по-другому, но всегда имел столбец «Список рассылки». Насколько я понимаю, для анализа JSON необходима схема, которую мне нужно будет сгенерировать. А также другие вещи, которые будут работать, но только для этого конкретного CSV, хотя я ожидаю получать в этом контейнере CSV с различной структурой. Достижимо ли то, о чем я прошу?
Нет, схема обязательна, но ее не нужно сопоставлять. Вы можете использовать {} в разделе схемы, чтобы добиться динамического сопоставления. Вы также можете использовать функцию RemoveProperty(), чтобы исключить список рассылки во время выполнения, чтобы вам не приходилось каждый раз вручную редактировать схему. Вы также можете включить сканирование на основе значений, удалив поле, содержащее «@» (поиск электронных писем).
Спасибо, и извините, я немного незнаком, где я могу добавить функцию RemoveProperty(), чтобы удалить столбец списка рассылки?
Я понял, как использовать метод RemoveProperty(), и пытаюсь использовать его при добавлении вложения к электронному письму, хотя, когда я использую его в действии Parse JSON, я получаю сообщение об ошибке, поскольку это массив. И когда я использую его в действии «Создать таблицу CSV», он говорит мне, что это строка. Он ожидает объект. Знаете ли вы, как я могу решить эту проблему?
Да, это возможно, но на ваш вопрос нет простого ответа. Вам просто нужно собрать детали Лего вместе.