Можно ли получить значение из большого двоичного объекта (загруженного в контейнер CSV) и передать его в приложение логики?

Я пытаюсь добавить динамический список рассылки в электронное письмо, которое отправляю с помощью приложения логики. Он срабатывает всякий раз, когда большой двоичный объект загружается в контейнер, за которым он наблюдает.

Возможно ли:

  1. возьмите значение из CSV и введите его в создаваемое электронное письмо.
  2. Можно ли исключить этот столбец, когда он прикрепляется к электронному письму?

Например, если 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"
        ]
    }
}

Да, это возможно, но на ваш вопрос нет простого ответа. Вам просто нужно собрать детали Лего вместе.

Skin 22.08.2024 10:05
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
1
75
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

Я использовал приведенный ниже код 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 необходима схема, которую мне нужно будет сгенерировать. Достижимо ли то, о чем я прошу?

BlakeB9 22.08.2024 23:53

По какой-то причине я также получаю сообщение об ошибке ``` {"error":{"code":"InvalidTemplate","message":"Проверка шаблона не удалась: 'Действие(я) 'Get_blob_content_V2', на которое ссылается 'inputs' ' в действии 'Execute_JavaScript_Code' не определены в шаблоне.'"}} ``` хотя я сконструировал его аналогичным образом. Есть идеи, что здесь может пойти не так?

BlakeB9 23.08.2024 01:04

не обращайте внимания на предыдущую ошибку — приложение логики скомпилировано правильно. Хотя я получаю эту ошибку в действии «Разбор 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 23.08.2024 04:44

@BlakeB9 Вам нужно добавить схему для действия Parse_JSON один раз для тела ввода. Пожалуйста, проверьте вывод, который вы получаете после выполнения действия javascript. На выходе должен быть массив тела

Ikhtesam Afrin 23.08.2024 05:38

Я взял выходные данные действия javascript и сгенерировал схему в действии Parse_JSON, но все равно получаю ту же ошибку.

BlakeB9 23.08.2024 18:37

@BlakeB9 Поделитесь выводом действия JavaScript, а также снимком экрана действия Parse json с входными данными и схемой.

Ikhtesam Afrin 23.08.2024 18:53
[ { "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
BlakeB9 23.08.2024 19:06

Вы должны получить выходные данные с параметром body из кода JavaScript. Используете ли вы workflowContext.actions.Get_blob_content_V2.outputs.body в JavaScript в качестве входных данных?

Ikhtesam Afrin 23.08.2024 19:17

Да, я. Анализ json не показывает никаких входных данных (потому что похоже, что он не может получить входные данные из сообщения об ошибке). Я обновлю свой пост схемой. Слишком долго, чтобы писать сюда

BlakeB9 23.08.2024 19:24

Ах, поверьте, я это понял. Мне нужно было изменить содержимое/ввод на outputs('Execute_Javascript_Code'), поэтому, по сути, уберите эту ?['body'] часть.

BlakeB9 23.08.2024 19:41

@BlakeB9 Рад, что это сработало для тебя

Ikhtesam Afrin 23.08.2024 21:10

Да,

Это длинный вопрос, но вы можете достичь всего этого.

1. Вы можете получить электронное письмо из CSV и добавить его в электронное письмо. Вам просто нужно сначала проанализировать его в JSON. Вы можете использовать этот пример стратегии.

2. Вы можете исключить этот столбец при вложении к электронному письму, создав проанализированный CSV-файл. Вы можете сделать это с помощью этой стратегии. Передайте JSON соответствующих значений в этот соединитель. Вывод можно прикрепить к электронному письму как содержимое файла.

Спасибо за ваш ответ! Я хочу добиться этого таким образом, чтобы мне больше не требовалось вводить данные вручную, если бы CSV был структурирован по-другому, но всегда имел столбец «Список рассылки». Насколько я понимаю, для анализа JSON необходима схема, которую мне нужно будет сгенерировать. А также другие вещи, которые будут работать, но только для этого конкретного CSV, хотя я ожидаю получать в этом контейнере CSV с различной структурой. Достижимо ли то, о чем я прошу?

BlakeB9 22.08.2024 23:59

Нет, схема обязательна, но ее не нужно сопоставлять. Вы можете использовать {} в разделе схемы, чтобы добиться динамического сопоставления. Вы также можете использовать функцию RemoveProperty(), чтобы исключить список рассылки во время выполнения, чтобы вам не приходилось каждый раз вручную редактировать схему. Вы также можете включить сканирование на основе значений, удалив поле, содержащее «@» (поиск электронных писем).

Laviza Falak Naz 23.08.2024 07:43

Спасибо, и извините, я немного незнаком, где я могу добавить функцию RemoveProperty(), чтобы удалить столбец списка рассылки?

BlakeB9 23.08.2024 19:29

Я понял, как использовать метод RemoveProperty(), и пытаюсь использовать его при добавлении вложения к электронному письму, хотя, когда я использую его в действии Parse JSON, я получаю сообщение об ошибке, поскольку это массив. И когда я использую его в действии «Создать таблицу CSV», он говорит мне, что это строка. Он ожидает объект. Знаете ли вы, как я могу решить эту проблему?

BlakeB9 26.08.2024 17:27

Другие вопросы по теме

Невозможно создать учетную запись хранения Azure: SubscriptionNotFound
Передача данных из учетной записи хранения Azure в репозиторий Azure DevOps ежедневно
Как разрешить доступ по IP-адресу к StorageAccount в виртуальной сети Azure?
Рекомендуемая практика доступа к хранилищу BLOB-объектов
Как скачать файл в учетную запись хранения Azure из приложения-функции
Сценарий PowerShell для получения учетной записи хранения Azure на основе имени и значения тега
Azure Blob: как автоматизировать преобразование архивного хранилища Azure в холодный/горячий уровень, отправить ссылку для загрузки, как только она станет доступна, и повторно заархивировать через 72 часа?
Как преобразовать общий файловый ресурс уровня «Премиум» в учетную запись хранения блочных BLOB-объектов уровня «Премиум» или стандартную учетную запись хранения общего назначения версии 2?
Ошибка SubscriptionNotFound Azure CLI, несмотря на правильную подписку и роль владельца
Ошибка Terraform 403 для учетной записи хранения с ограниченным доступом