Table of Contents

Dar formato a Power Query

Propósito del script

Si quieres dar formato a consultas complejas de Power Query para que sean más legibles y fáciles de modificar.

Note

Este script enviará tu código M de Power Query a la API de Power Query Formatter. Asegúrate de usar este script de forma responsable y cumpliendo la normativa al dar formato a tu código de Power Query.

Script

Dar formato a Power Query

// Este script da formato a Power Query (código M) de cualquier partición M seleccionada (no Shared Expression ni Source Expression).
// Enviará una solicitud HTTPS POST de la expresión a la API de Power Query Formatter y reemplazará el código por el resultado.
//
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

// URL de la API de powerqueryformatter.com
string powerqueryformatterAPI = "https://m-formatter.azurewebsites.net/api/v2";

// Método HttpClient para iniciar la llamada a la API mediante el método POST para la URL
HttpClient client = new HttpClient();
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, powerqueryformatterAPI);

// Obtener la expresión M de la partición seleccionada
string partitionExpression = Selected.Partition.Expression;

// Serializar el cuerpo de la solicitud como un objeto JSON
var requestBody = JsonConvert.SerializeObject(
    new { 
        code = partitionExpression, 
        resultType = "text", 
        lineWidth = 40, 
        alignLineCommentsToPosition = true, 
        includeComments = true
    });

// Establecer el encabezado "Content-Type" de la solicitud en "application/json" y la codificación en UTF-8
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

// Recuperar la respuesta
var response = client.PostAsync(powerqueryformatterAPI, content).Result;

// Si la respuesta es correcta
if (response.IsSuccessStatusCode)
{
    // Obtener el resultado de la respuesta
    var result = response.Content.ReadAsStringAsync().Result;

    // Analizar el objeto JSON de respuesta desde la cadena
    JObject data = JObject.Parse(result.ToString());

    // Obtener la respuesta de Power Query con formato
    string formattedPowerQuery = (string)data["result"];

    ///////////////////////////////////////////////////////////////////////
    // FORMATEO MANUAL OPCIONAL
    // Añadir manualmente una nueva línea y un comentario a cada paso
    var replace = new Dictionary<string, string> 
    { 
        { " //", "\n\n//" }, 
        { "\n  #", "\n\n  // Paso\n  #" }, 
        { "\n  Source", "\n\n  // Fuente de datos\n  Source" }, 
        { "\n  Dataflow", "\n\n  // Información de conexión de Dataflow\n  Dataflow" }, 
        {"\n  Data =", "\n\n  // Paso\n  Data ="}, 
        {"\n  Navigation =", "\n\n  // Paso\n  Navigation ="}, 
        {"in\n\n  // Paso\n  #", "in\n  #"}, 
        {"\nin", "\n\n// Resultado\nin"} 
    };

    // Reemplazar la primera cadena del diccionario por la segunda
    var manuallyformattedPowerQuery = replace.Aggregate(
        formattedPowerQuery, 
        (before, after) => before.Replace(after.Key, after.Value));

    // Reemplazar el código autoformateado por la versión con formato manual
    formattedPowerQuery = manuallyformattedPowerQuery;
    ////////////////////////////////////////////////////////////////////////

    // Reemplazar la expresión M sin formato por la expresión con formato
    Selected.Partition.Expression = formattedPowerQuery;

    // Ventana emergente para informar de la finalización
    Info("Formateado " + Selected.Partition.Name);
}

// En caso contrario, devolver un mensaje de error
else
{
Info(
    "Llamada a la API sin éxito." +
    "\nCompruebe que está seleccionando una partición con una expresión M válida."
    );
}

Explicación

Este fragmento crea una solicitud HTTP POST del código de Power Query de la partición M y la envía a Power Query Formatter. Se aplica algo de formato manual para que el código sea aún más legible.

Salida de ejemplo

Format Power Query example
Figura 1: Una ilustración de cómo el script formatea el código de Power Query.