Как подключить Excel к Microsoft QnA Maker (VBA) - PullRequest
1 голос
/ 03 апреля 2019

Я регулярно получаю файлы Excel с вопросами (у меня есть ответы от предыдущих итераций. Вопросы всегда схожи), и я хотел бы автоматизировать ответы. Я создал базу знаний в Microsoft QnAMaker со всеми парами вопросов / ответов.

Как мне позвонить в Microsoft QnAMaker, чтобы ответить на мои вопросы из excel. Я искал примеры VBA, но я ничего не нашел до сих пор. Я считаю, что мне нужно сделать HTTP-запрос с авторизацией от Excel, используя VBA, а затем обработать ответ. Будет ли у кого-то идея, как я могу сделать запрос и обработать его?

Любая помощь приветствуется. Спасибо!

Вот примерные данные, которые QnAMaker предоставляет для совершения звонка:

 POST /knowledgebases/d02d1d7e-1bc0-461a-8074-37749cae41b9/generateAnswer
 Host: https://rfp1.azurewebsites.net/qnamaker
 Authorization: EndpointKey cec4b630-9e77-474f-8df4-e6430a5678c8
 Content-Type: application/json
 {"question":"<Your question>"}

1 Ответ

2 голосов
/ 04 апреля 2019

Я нашел два способа сделать это. Во-первых, с VBA. Во-вторых, с Power Queries.

VBA

Опциональная настройка

enter image description here

  1. Добавьте вкладку Разработчик на ленту, выбрав Файл> Параметры> Настройка ленты> Проверить разработчика

  2. Перейдите на вкладку «Разработчик», затем «Вставка»> «Кнопка»

  3. Назовите макрос "GetReplies"

  4. Нажмите Новый

Примечания:

Настройка VBA

  1. На вкладке Разработчик нажмите кнопку Visual Basic (если она не открылась автоматически)

  2. Перейдите в Инструменты> Ссылки и включите следующие библиотеки: enter image description here

  3. Импорт этой библиотеки JSON в соответствии с инструкциями по установке

  4. Скопируйте / вставьте это:

код VBA:

Sub GetReplies()

    'User Settings
    Dim questionWorksheetName As String, questionsColumn As String, firstQuestionRow As String, kbHost As String, kbId As String, endpointKey As String

        questionWorksheetName = "Sheet1"
        questionsColumn = "A"
        firstQuestionRow = "2"

        kbHost = "https://**********.azurewebsites.net/qnamaker"
        kbId = "*******-****-****-****-**********"
        endpointKey = "*********-****-****-****-***********"

    'Non-User Settings
    Dim questionWorksheet As Worksheet
        Set questionWorksheet = Sheets(questionWorksheetName)
    Dim startCell As String
        startCell = questionsColumn & firstQuestionRow
    Dim questionsRange As Range
        Set questionsRange = questionWorksheet.Range(startCell, questionWorksheet.Range(startCell).End(xlDown))

    'Loop through all non-blank cells
    Dim answer As String
    For Each cell In questionsRange
        If Not IsEmpty(cell) Then
            answer = GetAnswer(cell.Value, kbHost, kbId, endpointKey)
            'Add answer to cell
            cell.Offset(0, 1).Value = answer
        End If
    Next

End Sub

Function GetAnswer(question, kbHost, kbId, endpointKey) As String
    'HTTP Request Settings
    Dim qnaUrl As String
        qnaUrl = kbHost & "/knowledgebases/" & kbId & "/generateAnswer"
    Dim contentType As String
        contentType = "application/json"
    Dim data As String
        data = "{""question"":""" & question & """}"

    'Send Request
    Dim xmlhttp As New MSXML2.XMLHTTP60

    xmlhttp.Open "POST", qnaUrl, False
        xmlhttp.SetRequestHeader "Content-Type", contentType
        xmlhttp.SetRequestHeader "Authorization", "EndpointKey " & endpointKey
    xmlhttp.Send data

    'Convert response to JSON
    Dim json As Dictionary
    Set json = JsonConverter.ParseJson(xmlhttp.ResponseText)

    Dim answer As Dictionary

    For Each answer In json("answers")
    'Return response
        GetAnswer = answer("answer")
    Next

End Function
  1. Отредактируйте «Настройки пользователя» вверху, соответственно

После запуска получаю:

enter image description here

Power Queries

Создание запроса HTTP-соединения

  1. Вкладка данных> Получить данные> Из других источников> Пустой запрос

  2. Нажмите Advanced Editor и скопируйте и вставьте

Код:

(Question as text) =>
let
    url = "https://***host****.azurewebsites.net/qnamaker/knowledgebases/****kbId******/generateAnswer",
    endpointKey = "****endpointKey*****",
    table = Excel.CurrentWorkbook(){[Name="Answers"]}[Content],
    row = Table.SelectRows(table, each ([Answer] = Question)),
    body = "{""question"":""" & Question & """}",
    Parsed_JSON = Json.Document(body),
    BuildQueryString = Uri.BuildQueryString(Parsed_JSON),
    headers = [#"Content-Type"="application/json", #"Authorization"="EndpointKey " & endpointKey],
    content = Text.ToBinary(body),
    Source = Json.Document(Web.Contents(url, [Headers = headers, Content = content])),
    answers = Source[answers],
    answers1 = answers{0},
    answer = answers1[answer]
in
    answer
  1. При необходимости заменить переменные

  2. Переименуйте запрос в «GetAnswer»

  3. Выход из Power Query, сохранение изменений

Создать таблицу

  1. Создайте таблицу со своими вопросами

enter image description here

  1. Выберите таблицу. Вкладка «Дизайн таблицы»> Переименовать таблицу в «Ответы»

  2. При выбранной таблице целиком вкладка «Данные»> «Из таблицы / диапазона»

  3. Добавить столбец> Вызвать пользовательскую функцию

  4. Имя столбца = Ответы, Запрос функции = GetAnswer, Вопрос: Имя столбца = Вопрос

  5. Хорошо. Ok / Выход / Save

Затем вы можете добавить вопрос в таблицу, перейти на лист, где была создана таблица Вопрос / Ответ, и нажать Обновить, чтобы получить новые ответы.

...