MS-Access получает сообщение об ошибке при вызове Qualtrics API во время выполнения ошибка 449 Аргумент не является обязательным - PullRequest
0 голосов
/ 23 января 2020

Я новичок в Access и в настоящее время работаю менеджером системы данных в исследовательской лаборатории по ВИЧ. Мы используем Qualtrics для создания опросов, которые участники могут проводить в Интернете, и мы используем Access для вызова API Qualtrics, чтобы добавлять участников в панель контактов Qualtrics, автоматически генерировать для них ссылки на опросы, отправлять ссылки на рассылку опросов участникам и сохранять их ответы в экспортированных файлах. ,

Вот ссылка на документацию по API Qualtrics: https://api.qualtrics.com/

Я перенесу всю функцию Qualtrics в v3 и перейду к этому аргументу времени выполнения Не является необязательной ошибкой при попытке создать ссылки на распространение опроса для участников и отправить им электронные письма со ссылками на опрос.

Вот ссылка на документацию API для функции Qualtrics, над которой я работаю - CreateSurveyDistributionLinks:

https://api.qualtrics.com/reference#distribution -create-1

https://api.qualtrics.com/reference#email -mailing-list

Ниже показан мой код:

Public Function createSurveyDistributionLinks(strSubject As String, _
     strMessageID As String, strRecipients As String, strSurveyID As String, _
     dtSendDate As Date, dtExpirationDate As Date)

'note: this function does not contain message feature as it is not 
'  used in 1KS. Can add for other uses by including a dicMessage object
Dim strURL As String
Dim JSON As Object
Dim dicMessage As Dictionary
Dim dicHeader As Dictionary
Dim strBodyJson As String
Dim strFromEmail As String
Dim strFromName As String


    Me.initObject
    strURL = "https://az1.qualtrics.com/API/v3/distributions"

    strFromEmail = "day2day%40chestnyc.org"
    strFromName = "day2day"
    strFromName = Replace(strFromName, " ", "%20") 'Convert spaces
    strSubject = Replace(strSubject, " ", "%20") 'Convert spaces


    Set dicHeader = New Dictionary

    dicHeader("fromEmail") = strFromEmail
    dicHeader("fromName") = strFromName
    dicHeader("subject") = strSubject

    Set dicMessage = New Dictionary
    dicMessage("messageId") = strMessageID
    dicMessage("libraryId") = strLibID

    dicMessage("header") = dicHeader


    Set dicBody = New Dictionary
    dicBody("recipients") = strRecipients
    dicBody("surveyId") = strSurveyID
    dicBody("sendDate") = formatQualtricsTimes(dtSendDate)
    dicBody("expirationDate") = formatQualtricsTimes(Nz(dtExpirationDate, "2050-01-01 00:00:00"))
    dicBody("message") = dicMessage

    strBodyJson = JsonConverter.ConvertToJson(dicBody)
    Debug.Print strBodyJson

    With xmlhttprequester
        .Open "POST", strURL
        .setRequestHeader "X-API-TOKEN", strToken
        .setRequestHeader "Content-Type", "application/json"
        .send strBodyJson

        .waitForResponse
        If InStr(.responseText, "EMD_") > 0 Then
            'it worked!
            Set JSON = JsonConverter.ParseJson(.responseText)
            Dim strrand As String
            createSurveyDistributionLinks = JSON("result")("id")
            Debug.Print JSON("result")("id")
        Else
            Debug.Print "an error has occurred" & vbNewLine & .responseText
            createSurveyDistributionLinks = "false"
        End If
    End With

End Function

Вот строка, где я обнаружил ошибку во время выполнения:

 strDistributionID = oQual.createSurveyDistributionLinks(strSubject, _
    strMessageID, strRecipientID, strSurveyID, CStr(dtExpTime), CStr(dtTime))

Я был бы очень признателен за все ваши идеи, очень надеюсь, что мой код работает !!

Best, Jess

1 Ответ

1 голос
/ 24 января 2020

При работе с пользовательскими классами в VBA необходимо убедиться, что для обработки ошибок VBA установлено значение «Взломать модуль класса», иначе вы не увидите основную ошибку в своем экземпляре класса (вы получаете только ошибку при входе точка - в этом случае строка, которая вызывает oQual.createSurveyDistributionLinks).

Ваш код должен включать Set при назначении переменной типа объекта словарю:

Set dicMessage("header") = dicHeader 

Set dicBody("message") = dicMessage
...