You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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函数定义后并未调用,导致等待逻辑完全未生效,即使修复语法错误,也无法实现等待报表生成完成再获取结果的需求。

修复方案

  1. 给if语句补充else分支,返回初始的doneFlag值
  2. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 23:21:02