Cómo escribir datos JSON anidados a Google Hojas

Estoy tratando de escribir datos JSON a Google Sheets pero creo que no se está convirtiendo en la lista de arrays adecuada.

Cuando estoy haciendo Logger.log(dataAll), Estoy recibiendo la siguiente respuesta:

Logging output too large. Truncating output. {EmployeeLeaveTransactions=[{StartDateShift=Full Day, EmployeeCode=xxxx, Remarks=Personal, LeaveTypeCode=PrL, Approver1code=xxxx, Applicationtodate=31-12-2020, Reason=Personal, EndDateShift=Full Day, Numberofdays=10, AppliedDate=21-12-2020, LeaveTypeDescription=Privilege Leave, Status=Applied, Approver3code=, Applicationfromdate=22-12-2020, Approver2code=xxxx}, {Numberofdays=4, Approver1code=xxxx, AppliedDate=21-12-2020, Approver3code=, Reason=Personal, StartDateShift=Full Day, Remarks=, LeaveTypeCode=PrL, EmployeeCode=xxxx, Applicationfromdate=07-12-2020, Approver2code=xxxx, Applicationtodate=10-12-2020, LeaveTypeDescription=Privilege Leave, Status=Applied, EndDateShift=Full Day}, {AppliedDate=20-12-2020, EndDateShift=Full Day, Numberofdays=14, EmployeeCode=A00847, Approver2code=xxxx, StartDateShift=Full Day, Remarks=Personal, Approver1code=xxxx, LeaveTypeDescription=Privilege Leave, Approver3code=, Applicationtodate=13-12-2020, Reason=Personal, LeaveTypeCode=PrL, Status=Applied, Applicationfromdate=30-11-2020},

He probado el siguiente código hasta ahora, pero no cómo escribir datos planos (en forma tabular) a las hojas de Google

function leaveDetails() {

  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Dates');
  var url = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
  var toDate = ss.getRange(2, 2).getValue();
  var fromDate = ss.getRange(1, 2).getValue();


  var data =
  {
    "SubscriptionName": "xxxxxxxxxxxxxxxxxx",
    "Token": "xxxxxxxxxxxxxxxxxxxxxxxxx",
    "Actionfromdate": fromDate,
    "Actiontodate": toDate,
    "Leavetypecode": "PrL"
  };

  var options = {
    'method': 'post',
    'contentType': 'application/json',
    // Convert the JavaScript object to a JSON string.
    'payload': JSON.stringify(data)
  };
  var newData = UrlFetchApp.fetch(url, options);
  var dataAll = JSON.parse(newData.getContentText());

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Master');
 
  var newArr = [];

  newArr.push(dataAll);

  Logger.log(dataAll);
  
}

Pregunta hecha hace 3 años, 4 meses, 24 días - Por syntaxsorcerer


3 Respuestas:

  • Considerando que dataAll Actualmente parece que

    {EmployeeLeaveTransactions=[{StartDateShift=Full Day, EmployeeCode=xxxx, Remarks=Personal, LeaveTypeCode=PrL, Approver1code=xxxx, Applicationtodate=31-12-2020, Reason=Personal, EndDateShift=Full Day, Numberofdays=10, AppliedDate=21-12-2020, LeaveTypeDescription=Privilege Leave, Status=Applied, Approver3code=, Applicationfromdate=22-12-2020, Approver2code=xxxx}, {Numberofdays=4, Approver1code=xxxx, AppliedDate=21-12-2020, Approver3code=, Reason=Personal, StartDateShift=Full Day, Remarks=, LeaveTypeCode=PrL, EmployeeCode=xxxx, Applicationfromdate=07-12-2020, Approver2code=xxxx, Applicationtodate=10-12-2020, LeaveTypeDescription=Privilege Leave, Status=Applied, EndDateShift=Full Day}, {AppliedDate=20-12-2020, EndDateShift=Full Day, Numberofdays=14, EmployeeCode=A00847, Approver2code=xxxx, StartDateShift=Full Day, Remarks=Personal, Approver1code=xxxx, LeaveTypeDescription=Privilege Leave, Approver3code=, Applicationtodate=13-12-2020, Reason=Personal, LeaveTypeCode=PrL, Status=Applied, Applicationfromdate=30-11-2020},...
    

    Definición var EmployeeLeaveTransactions = dataAll.EmployeeLeaveTransactionsdebe resultar en un array como

      [
        {
          "StartDateShift":"Full Day",
          "EmployeeCode":"xxxx",
          "Remarks":"Personal",
          "LeaveTypeCode":"PrL"
          ...
        },
          {
          "Numberofdays":4, 
          "Approver1code":"xxxx", 
          "AppliedDate":"21-12-2020",    
          ...
        } 
       ]
    

    Cuando lo loges, el registro se verá como:

    [{EmployeeCode=xxxx, StartDateShift=Full Day,...}, {Approver1code=xxxx, Numberofdays=4.0,...}]
    

    En este tipo de objeto se puede utilizar el objeto.keys() método para acceder a los pares de valores clave contenidos en el objeto JSON y para pasarlos a un array que se puede utilizar para escribir en hojas de Google.

    Muestra:

    var EmployeeLeaveTransactions = dataAll.EmployeeLeaveTransactions;
    var array = [];
      for (var i = 0; i< EmployeeLeaveTransactions.length; i++){
        var newJson = Object.keys(EmployeeLeaveTransactions[i]).map(function (key) { 
          return [key, EmployeeLeaveTransactions[i][key]]; 
        }); 
        for(var j = 0; j< newJson.length; j++){
          array.push(newJson[j]);
        }
      }
      var ss = SpreadsheetApp.getActive();
      var sheet = ss.getActiveSheet();  
      var range = sheet.getRange(1,1, array.length, array[0].length);
      range.setValues(array);
    
    

    Respondida el Dec 21, 2020 a las 07:47 - por htmlhelix

    Votos positivos: 0 | Votos negativos: 0

  • En el código proporcionado, estás obteniendo datos JSON de una URL, convirtiéndolos en un objeto JavaScript y luego intentando guardarlos en un array newArr. Sin embargo, parece que los datos que estás recibiendo son un objeto anidado y no un array directo. Por esta razón, al intentar guardarlos en un array, solo estás agregando un solo elemento a newArr.

    Para abordar este problema y escribir los datos JSON anidados en una hoja de cálculo de Google como datos tabulares, necesitarás iterar sobre los elementos en el objeto dataAll y agregar cada uno de ellos como una fila en la hoja de cálculo.

    A continuación, te muestro cómo puedes modificar tu código para lograr esto:

    javascript
    function leaveDetails() {
    
      var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Dates');
      var url = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
      var toDate = ss.getRange(2, 2).getValue();
      var fromDate = ss.getRange(1, 2).getValue();
    
    
      var data =
      {
        "SubscriptionName": "xxxxxxxxxxxxxxxxxx",
        "Token": "xxxxxxxxxxxxxxxxxxxxxxxxx",
        "Actionfromdate": fromDate,
        "Actiontodate": toDate,
        "Leavetypecode": "PrL"
      };
    
      var options = {
        'method': 'post',
        'contentType': 'application/json',
        // Convert the JavaScript object to a JSON string.
        'payload': JSON.stringify(data)
      };
      var newData = UrlFetchApp.fetch(url, options);
      var dataAll = JSON.parse(newData.getContentText());
    
      var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Master');
    
      // Asegúrate de que "EmployeeLeaveTransactions" es un array en el objeto JSON
      if (Array.isArray(dataAll.EmployeeLeaveTransactions)) {
        var transactions = dataAll.EmployeeLeaveTransactions;
    
        // Iterar sobre cada transacción y agregarla como una fila en la hoja de cálculo
        transactions.forEach(function(transaction) {
          sheet.appendRow([
            transaction.StartDateShift,
            transaction.EmployeeCode,
            transaction.Remarks,
            transaction.LeaveTypeCode,
            transaction.Approver1code,
            transaction.Applicationtodate,
            transaction.Reason,
            transaction.EndDateShift,
            transaction.Numberofdays,
            transaction.AppliedDate,
            transaction.LeaveTypeDescription,
            transaction.Status,
            transaction.Approver3code,
            transaction.Applicationfromdate,
            transaction.Approver2code
          ]);
        });
      } else {
        Logger.log('EmployeeLeaveTransactions is not an array in the JSON data.');
      }
    
    }
    

    En este código modificado, se verifica si EmployeeLeaveTransactions es un array en el objeto dataAll, y si es así, recorremos cada elemento y agregamos sus propiedades como una fila en la hoja de cálculo Master.

    Espero que esta modificación te ayude a escribir los datos JSON anidados en una hoja de Google Sheets de manera tabular. Si tienes alguna otra pregunta o necesitas más ayuda, ¡no dudes en decirme!

    Respondida el Dec 22, 2020 a las 07:49 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El problema con tu código es que estás intentando insertar todo el objeto JSON en una sola celda de Google Sheets. Google Sheets espera una lista de listas para los datos, por lo que debes convertir tu objeto JSON en una lista de listas antes de insertarlo en la hoja de cálculo.

    Aquí tienes el código corregido:

    
    function leaveDetails() {
    
      var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Dates');
      var url = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
      var toDate = ss.getRange(2, 2).getValue();
      var fromDate = ss.getRange(1, 2).getValue();
    
    
      var data =
      {
        "SubscriptionName": "xxxxxxxxxxxxxxxxxx",
        "Token": "xxxxxxxxxxxxxxxxxxxxxxxxx",
        "Actionfromdate": fromDate,
        "Actiontodate": toDate,
        "Leavetypecode": "PrL"
      };
    
      var options = {
        'method': 'post',
        'contentType': 'application/json',
        // Convert the JavaScript object to a JSON string.
        'payload': JSON.stringify(data)
      };
      var newData = UrlFetchApp.fetch(url, options);
      var dataAll = JSON.parse(newData.getContentText());
    
      // Convertir el objeto JSON en una lista de listas
      var rows = [];
      for (var i = 0; i < dataAll.EmployeeLeaveTransactions.length; i++) {
        var row = [];
        row.push(dataAll.EmployeeLeaveTransactions[i].StartDateShift);
        row.push(dataAll.EmployeeLeaveTransactions[i].EmployeeCode);
        row.push(dataAll.EmployeeLeaveTransactions[i].Remarks);
        row.push(dataAll.EmployeeLeaveTransactions[i].LeaveTypeCode);
        row.push(dataAll.EmployeeLeaveTransactions[i].Approver1code);
        row.push(dataAll.EmployeeLeaveTransactions[i].Applicationtodate);
        row.push(dataAll.EmployeeLeaveTransactions[i].Reason);
        row.push(dataAll.EmployeeLeaveTransactions[i].EndDateShift);
        row.push(dataAll.EmployeeLeaveTransactions[i].Numberofdays);
        row.push(dataAll.EmployeeLeaveTransactions[i].AppliedDate);
        row.push(dataAll.EmployeeLeaveTransactions[i].LeaveTypeDescription);
        row.push(dataAll.EmployeeLeaveTransactions[i].Status);
        row.push(dataAll.EmployeeLeaveTransactions[i].Approver3code);
        row.push(dataAll.EmployeeLeaveTransactions[i].Applicationfromdate);
        row.push(dataAll.EmployeeLeaveTransactions[i].Approver2code);
        rows.push(row);
      }
    
      var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Master');
    
      // Insertar los datos en la hoja de cálculo
      sheet.getRange(2, 1, rows.length, rows[0].length).setValues(rows);
    
      Logger.log(dataAll);
    
    }
    

    Con este código, los datos JSON se insertarán correctamente en Google Sheets como una lista de listas.

    Respondida el Dec 22, 2020 a las 08:02 - por Gemini

    Votos positivos: 0 | Votos negativos: 0