Partilhar via


Cenário de exemplo de Scripts do Office: Obter e grafar dados ao nível da água da NOAA

Neste cenário, precisa de desenhar o nível da água na estação de Seattle da Administração Oceânica e Atmosférica Nacional. Irá utilizar dados externos para preencher uma folha de cálculo e criar um gráfico.

Irá desenvolver um script que utiliza o fetch comando para consultar a base de dados NOAA Tides and Currents. Isso fará com que o nível da água seja registado num determinado intervalo de tempo. As informações serão devolvidas como JSON, pelo que parte do script irá traduzi-lo em valores de intervalo. Assim que os dados estiverem na folha de cálculo, serão utilizados para criar um gráfico.

Para obter mais informações sobre como trabalhar com JSON, leia Utilizar JSON para transmitir dados de e para Scripts do Office.

Competências de scripting abrangidas

  • Chamadas à API Externa (fetch)
  • Análise JSON
  • Gráficos

Instruções de configuração

  1. Abra a pasta de trabalho no Excel.

  2. No separador Automatizar , selecione Novo Script>Criar no Editor de Código. Cole o seguinte script no editor.

    /**
     * Gets data from the National Oceanic and Atmospheric Administration's Tides and Currents database. 
     * That data is used to make a chart.
     */
    async function main(workbook: ExcelScript.Workbook) {
      // Get the current sheet.
      let currentSheet = workbook.getActiveWorksheet();
    
      // Create selection of parameters for the fetch URL.
      // More information on the NOAA APIs is found here: 
      // https://api.tidesandcurrents.noaa.gov/api/prod/
      const option = "water_level";
      const startDate = "20201225"; /* yyyymmdd date format */
      const endDate = "20201227";
      const station = "9447130"; /* Seattle */
    
      // Construct the URL for the fetch call.
      const strQuery = `https://api.tidesandcurrents.noaa.gov/api/prod/datagetter?product=${option}&begin_date=${startDate}&end_date=${endDate}&datum=MLLW&station=${station}&units=english&time_zone=gmt&application=NOS.COOPS.TAC.WL&format=json`;
    
      console.log(strQuery);
    
      // Resolve the Promises returned by the fetch operation.
      const response = await fetch(strQuery);
      const rawJson: string = await response.json();
    
      // Translate the raw JSON into a usable state.
      const stringifiedJson = JSON.stringify(rawJson);
    
      // Note that we're only taking the data part of the JSON and excluding the metadata.
      const noaaData: NOAAData[] = JSON.parse(stringifiedJson).data;
    
      // Create table headers and format them to stand out.
      let headers = [["Time", "Level"]];
      let headerRange = currentSheet.getRange("A1:B1");
      headerRange.setValues(headers);
      headerRange.getFormat().getFill().setColor("#4472C4");
      headerRange.getFormat().getFont().setColor("white");
    
      // Insert all the data in rows from JSON.
      let noaaDataCount = noaaData.length;
      let dataToEnter = [[], []]
      for (let i = 0; i < noaaDataCount; i++) {
        let currentDataPiece = noaaData[i];
        dataToEnter[i] = [currentDataPiece.t, currentDataPiece.v];
      }
    
      let dataRange = currentSheet.getRange("A2:B" + String(noaaDataCount + 1)); /* +1 to account for the title row */
      dataRange.setValues(dataToEnter);
    
      // Format the "Time" column for timestamps.
      dataRange.getColumn(0).setNumberFormatLocal("[$-en-US]mm/dd/yyyy hh:mm AM/PM;@");
    
      // Create and format a chart with the level data.
      let chart = currentSheet.addChart(ExcelScript.ChartType.xyscatterSmooth, dataRange);
      chart.getTitle().setText("Water Level - Seattle");
      chart.setTop(0);
      chart.setLeft(300);
      chart.setWidth(500);
      chart.setHeight(300);
      chart.getAxes().getValueAxis().setShowDisplayUnitLabel(false);
      chart.getAxes().getCategoryAxis().setTextOrientation(60);
      chart.getLegend().setVisible(false);
    
      // Add a comment with the data attribution.
      currentSheet.addComment(
        "A1",
        `This data was taken from the National Oceanic and Atmospheric Administration's Tides and Currents database on ${new Date(Date.now())}.`
      );
    
      /**
       * An interface to wrap the parts of the JSON we need.
       * These properties must match the names used in the JSON.
       */ 
      interface NOAAData {
        t: string; // Time
        v: number; // Level
      }
    }
    
  3. Mude o nome do script para NOAA Water Level Chart e guarde-o.

Executando o script

Em qualquer folha de cálculo, execute o script de Gráfico ao Nível da Água da NOAA . O script obtém os dados do nível da água de 25 de dezembro de 2020 a 27 de dezembro de 2020. As const variáveis no início do script podem ser alteradas para utilizar datas diferentes ou obter informações de estação diferentes. A API CO-OPS para Obtenção de Dados descreve como obter todos estes dados.

Depois de executar o script

A folha de cálculo depois de executar o script mostra alguns dados ao nível da água e um gráfico.