Я нашел два способа сделать это. Во-первых, с VBA. Во-вторых, с Power Queries.
VBA
Опциональная настройка
Добавьте вкладку Разработчик на ленту, выбрав Файл> Параметры> Настройка ленты> Проверить разработчика
Перейдите на вкладку «Разработчик», затем «Вставка»> «Кнопка»
Назовите макрос "GetReplies"
Нажмите Новый
Примечания:
Настройка VBA
На вкладке Разработчик нажмите кнопку Visual Basic (если она не открылась автоматически)
Перейдите в Инструменты> Ссылки и включите следующие библиотеки:
Импорт этой библиотеки JSON в соответствии с инструкциями по установке
Скопируйте / вставьте это:
код 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
- Отредактируйте «Настройки пользователя» вверху, соответственно
После запуска получаю:
Power Queries
Создание запроса HTTP-соединения
Вкладка данных> Получить данные> Из других источников> Пустой запрос
Нажмите 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
При необходимости заменить переменные
Переименуйте запрос в «GetAnswer»
Выход из Power Query, сохранение изменений
Создать таблицу
- Создайте таблицу со своими вопросами
Выберите таблицу. Вкладка «Дизайн таблицы»> Переименовать таблицу в «Ответы»
При выбранной таблице целиком вкладка «Данные»> «Из таблицы / диапазона»
Добавить столбец> Вызвать пользовательскую функцию
Имя столбца = Ответы, Запрос функции = GetAnswer, Вопрос: Имя столбца = Вопрос
Хорошо. Ok / Выход / Save
Затем вы можете добавить вопрос в таблицу, перейти на лист, где была создана таблица Вопрос / Ответ, и нажать Обновить, чтобы получить новые ответы.