Power Query中finalResult步骤报错:预期else token问题排查求助
Power Query M语言报错:"an else token was expected" 修复方案
问题描述
在Power Query中执行M语言脚本时,创建finalResult步骤时触发错误:"an else token was expected"。已尝试调整finalResult位置、逐步移除步骤,但问题仍存在。
原错误代码
let // Кодирование учетных данных в формате base64 basic = Binary.ToText(Text.ToBinary("***" & ":" & "***"), BinaryEncoding.Base64), // Определение функции для выполнения GET-запроса с учетом авторизации GetJson = (url as text, authHeader as text) => let // Выполнение GET-запроса и получение данных в формате JSON response = Web.Contents(url, [Headers=[#"Authorization"=authHeader]]), json = Json.Document(response) in json, // Определение функции для получения прогресса выполнения запроса GetProgress = (url as text, authHeader as text) => let // Получение данных прогресса в формате base64 и последующий парсинг JSON response = Web.Contents(url, [Headers=[#"Authorization"=authHeader]]), jsonResponse = Text.FromBinary(response, BinaryEncoding.Base64), json = Json.Document(jsonResponse) in json, // Определение функции для получения результата запроса GetResult = (url as text, authHeader as text) => let // Получение результата в формате base64 и последующий парсинг JSON response = Web.Contents(url, [Headers=[#"Authorization"=authHeader]]), jsonResponse = Text.FromBinary(response, BinaryEncoding.Base64), json = Json.Document(jsonResponse) in json, // URL и заголовок авторизации для получения отчета url1 = "https://asu.***:7050/rest/Report/Start/Stat?Objs=3157234151&StTime=2023-06-01T00:00:00&EnTime=2023-07-01T00:00:00&Params=ZStopTime,NZStopTime,MoveTime,PathLen,Date,WorkTime_TRASH,WorkTime_STEAM,WorkTime_CRANE,WorkTime_BLADE,WorkTime_PUMP,WorkTime_DIGGER,WorkTime_MIXER,WorkTime_SPREADER,WorkTime_GENERATOR,WorkTime_PUMP_1,WorkTime_CEMENTING,WorkTime_DRILL&format=json", authHeader = "Basic " & basic, // Получение отчета result1 = GetJson(url1, authHeader), requestID = result1[RequestID], // URL и заголовок авторизации для получения прогресса выполнения отчета url2 = "https://asu.***:7050/rest/Report/GetProgress/" & requestID & "?format=json", authHeader2 = "Basic " & basic, progress = GetProgress(url2, authHeader2), // Функция ожидания завершения выполнения запроса waitForCompletion = () => let // Проверка завершения и ожидание, если запрос еще не завершен doneFlag = progress[Done], waitPeriod = #duration(0, 0, 0, 10), endTime = DateTime.LocalNow() + waitPeriod in if doneFlag <> 1 then let loop = List.Generate( () => [result = GetProgress(url2, authHeader2), currentTime = DateTime.LocalNow()], each [result][Done] <> 1 and [currentTime] < endTime, each [result = GetProgress(url2, authHeader2), currentTime = DateTime.LocalNow()] ), lastResult = List.Last(loop), doneFlag = lastResult[result][Done] in doneFlag, // Получение окончательного результата finalResult = GetResult("https://asu.***:7050/rest/Report/GetResult/" & requestID & "?format=json", authHeader) in finalResult
错误根源
M语言要求if表达式必须同时包含then和else分支,不能只有单边分支。代码中waitForCompletion函数里的if doneFlag <> 1 then ...没有对应else分支,这是触发错误的直接原因。
另外,当前代码中waitForCompletion函数定义后并未调用,导致等待逻辑完全未生效,即使修复语法错误,也无法实现等待报表生成完成再获取结果的需求。
修复方案
- 给
if语句补充else分支,返回初始的doneFlag值 - 调用
waitForCompletion函数,确保等待逻辑执行完成后再获取最终结果
修复后的完整代码:
let // Кодирование учетных данных в формате base64 basic = Binary.ToText(Text.ToBinary("***" & ":" & "***"), BinaryEncoding.Base64), // Определение функции для выполнения GET-запроса с учетом авторизации GetJson = (url as text, authHeader as text) => let response = Web.Contents(url, [Headers=[#"Authorization"=authHeader]]), json = Json.Document(response) in json, // Определение функции для получения прогресса выполнения запроса GetProgress = (url as text, authHeader as text) => let response = Web.Contents(url, [Headers=[#"Authorization"=authHeader]]), jsonResponse = Text.FromBinary(response, BinaryEncoding.Base64), json = Json.Document(jsonResponse) in json, // Определение функции для получения результата запроса GetResult = (url as text, authHeader as text) => let response = Web.Contents(url, [Headers=[#"Authorization"=authHeader]]), jsonResponse = Text.FromBinary(response, BinaryEncoding.Base64), json = Json.Document(jsonResponse) in json, // URL и заголовок авторизации для получения отчета url1 = "https://asu.***:7050/rest/Report/Start/Stat?Objs=3157234151&StTime=2023-06-01T00:00:00&EnTime=2023-07-01T00:00:00&Params=ZStopTime,NZStopTime,MoveTime,PathLen,Date,WorkTime_TRASH,WorkTime_STEAM,WorkTime_CRANE,WorkTime_BLADE,WorkTime_PUMP,WorkTime_DIGGER,WorkTime_MIXER,WorkTime_SPREADER,WorkTime_GENERATOR,WorkTime_PUMP_1,WorkTime_CEMENTING,WorkTime_DRILL&format=json", authHeader = "Basic " & basic, // Получение отчета result1 = GetJson(url1, authHeader), requestID = result1[RequestID], // URL и заголовок авторизации для получения прогресса выполнения отчета url2 = "https://asu.***:7050/rest/Report/GetProgress/" & requestID & "?format=json", authHeader2 = "Basic " & basic, // Функция ожидания завершения выполнения запроса waitForCompletion = () => let waitPeriod = #duration(0, 0, 0, 10), endTime = DateTime.LocalNow() + waitPeriod, loop = List.Generate( () => [result = GetProgress(url2, authHeader2), currentTime = DateTime.LocalNow()], each [result][Done] <> 1 and [currentTime] < endTime, each [result = GetProgress(url2, authHeader2), currentTime = DateTime.LocalNow()] ), lastResult = List.Last(loop), doneFlag = lastResult[result][Done] in doneFlag, // 执行等待逻辑 waitDone = waitForCompletion(), // Получение окончательного результата finalResult = GetResult("https://asu.***:7050/rest/Report/GetResult/" & requestID & "?format=json", authHeader) in finalResult
额外排查建议
- 检查所有
if表达式是否都严格遵循if ... then ... else ...语法结构 - 确认函数定义后是否有实际调用,避免逻辑代码闲置
- 可以在关键步骤添加
Table.FromRecords或Text.From等转换,临时输出中间结果,验证数据格式是否符合预期
内容的提问来源于stack exchange,提问作者Maks Verkhovsky
相关产品推荐
相关产品推荐

