Я пытаюсь найти альтернативу Excel Javascript API для функции VBA для получения данных с URL-адреса на лист Excel.В VBA я использую Querytable с методом add для получения данных из URL-адреса с использованием этого фрагмента кода:
Dim URLprefix As String
Dim ProjectID As String
Dim SnapshotID As String
Dim ResultType As String
Dim Hash As String
Dim lngNumberOfCols As Long
URLprefix = "https://mywebsite.com"
With Sheets("Definition")
ProjectID = .Range("B3")
SnapshotID = .Range("B4")
Hash = .Range("B5")
End With
Set ws = Worksheets("Import")
ws.Select
ws.Cells.Select
Cells.Delete
'Get the Produc definitions from the EvalDB query
ResultType = "product"
Set QT = ws.QueryTables.Add("URL;" & URLprefix & ProjectID & "&id_snapshot=" & SnapshotID & "&type=" & ResultType & "&hash=" & Hash, Destination:=Range("$A$3"))
QT.Refresh BackgroundQuery:=False
'Get the property definitions
ResultType = "property"
Set QT = ws.QueryTables.Add("URL;" & URLprefix & ProjectID & "&id_snapshot=" & SnapshotID & "&type=" & ResultType & "&hash=" & Hash, Destination:=Range("$D$1"))
'get the results
ResultType = "result"
QT.Refresh BackgroundQuery:=False
**Set QT = ws.QueryTables.Add("URL;" & URLprefix & ProjectID & "&id_snapshot=" & SnapshotID & "&type=" & ResultType & "&hash=" & Hash, Destination:=Range("$D$3"))**
QT.Refresh BackgroundQuery:=False
Это ядро фрагмента VBA:
Set QT = ws.QueryTables.Add("URL;" & URLprefix & ProjectID & "&id_snapshot=" & SnapshotID & "&type=" & ResultType & "&hash=" & Hash, Destination:=Range("$A$3"))
QT.Refresh BackgroundQuery:=False
'Get the property definitions
ResultType = "property"
Set QT = ws.QueryTables.Add("URL;" & URLprefix & ProjectID & "&id_snapshot=" & SnapshotID & "&type=" & ResultType & "&hash=" & Hash, Destination:=Range("$D$1"))
Это прекрасно работаетв VBA
Но он не работает с запросом XMLhttp в Office JS API, и на веб-сайте Microsoft и вообще нигде нет никакой информации.Я использую следующую функцию, найденную в этом посте здесь при переполнении стека
var HttpClient = function () {
this.get = function (aUrl, aCallback) {
var anHttpRequest = new XMLHttpRequest();
anHttpRequest.onreadystatechange = function () {
if (anHttpRequest.readyState === 4 && anHttpRequest.status === 200)
aCallback(anHttpRequest.responseText);
}
anHttpRequest.open("GET", aUrl, true);
anHttpRequest.send(null);
}
}
никогда не будет статуса readystate или xmlhttp, но если я перейду в Excel-> data-> из Интернета ииспользуйте тот же URL, данные будут импортированы правильно.Ясно, что я не делаю это правильно, но я не знаю, где искать
Обновление : здесь фрагмент для вызова XmlHTTP-запроса:
// Run a batch operation against the Excel object model
Excel.run(function (ImportData) {
// Create a proxy object for the active sheet
var sheet = ImportData.workbook.worksheets.getActiveWorksheet();
// Queue a command to write the sample data to the worksheet
var client = new HttpClient();
sheet.getRange("A1").values = client.get(QueryString, function (response) {
});
// Run the queued-up commands, and return a promise to indicate task completion
return ImportData.sync();
});
Как важнона самом деле, после копания глубже я действительно увидел, что это ошибка CORS:
HTML1300: произошла навигация.FunctionFile.html SEC7120: Origin https://localhost:44301 не найден в заголовке Access-Control-Allow-Origin.FunctionFile.html SCRIPT7002: XMLHttpRequest: Сетевая ошибка 0x80700013, не удалось завершить операцию из-за ошибки 80700013. FunctionFile.html
Но как решить эту проблему, не создавая и не размещая веб-службу для получения данных из другого домена?
Большое спасибо за помощь
привет