0

我正在使用 script.google.com 创建一个自定义连接器,该连接器可以从 drive.google.com 读取 CSV 数据并将数据发送到 Google 数据工作室。

运行连接器并在数据工作室中插入一个简单表时,我收到一个简单的消息,即由于服务器错误而无法处理请求。每次我“重新发布”脚本时,错误 ID 都会发生变化。

这是

function getData(request) {

  var dataSchema = [];

  request.fields.forEach(function(field) {
    for (var i = 0; i < csvDataSchema.length; i++) {
      if (csvDataSchema[i].name === field.name) {
        dataSchema.push(csvDataSchema[i]);
        break;
      }
    }
  });

  csvFile = UrlFetchApp.fetch("https://drive.google.com/uc?export=download&id=" + request.configParams.documentId);
  var csvData = Utilities.parseCsv(csvFile);

  var data = [];

  csvData.forEach(function(row) {
    data.push({
      values: row
    });
  });


  console.log(  {
    schema: dataSchema,
    rows: data
  } );

  return {
    schema: dataSchema,
    rows: data
  };
};

这是 csvDataSchema:

var csvDataSchema = [
  {
    name: 'date',
    label: 'Date',
    dataType: 'STRING',
    semantics: {
      conceptType: 'DIMENSION'
    }
  },
  {
    name: 'nanoseconds',
    label: 'nanoseconds',
    dataType: 'NUMBER',
    semantics: {
      "isReaggregatable": true,
      conceptType: 'METRIC'
    }
  },{
    name: 'size',
    label: 'Size of Testfile in MByte',
    dataType: 'STRING',
    semantics: {
      "isReaggregatable": false,
      conceptType: 'DIMENSION'
  }

  }
];

这是 getData 函数的结果,字符串化:

{"schema":[{"name":"date","label":"Date","dataType":"STRING","semantics":{"conceptType":"DIMENSION"}},{"name":"size","label":"Size of Testfile in MByte","dataType":"STRING","semantics":{"isReaggregatable":false,"conceptType":"DIMENSION"}}],"rows":[{"values":["2017-05-23",123,"1"]},{"values":["2017-05-23",123,"1"]}]}

它完全符合参考。我正在提供更多信息,但无论如何按照教程它应该可以工作。

这些是请求中提供的字段:

在此处输入图像描述

这就是 getDate返回的内容:

在此处输入图像描述

所以,我首先想知道的是:为什么会有一个随机错误 id?我的脚本可能有什么问题?

4

2 回答 2

1

您应该只返回包含在request. 目前,data包含 中的所有字段csvFile。根据仪表板中的图表元素,request很可能只包含完整架构的一个子集。请参阅Data Studio Open Source repo 中的示例实现

如果这不能解决问题,您应该设置错误处理并检查错误是否发生在任何特定行。

于 2017-11-06T08:34:30.920 回答
0

@Minhaz Kazi 给出了缺失的提示:

由于我没有“动态地”填充 getData 中的响应对象,所以我总是返回所有三列。

使用上面的代码,我唯一要做的就是将第三列添加为维度或指标。

所以我更改了我的代码以动态返回列,以便它适合响应。为此,我必须实现一个将 CSV 数据转换为对象的函数。

这是现在的 getData() 函数:

  function getData(request) {

  var url = "https://drive.google.com/uc?export=download&id="
  + request.configParams.documentId;

  var csvFile = UrlFetchApp.fetch(url);

  var csvData = Utilities.parseCsv(csvFile);

  var sourceData = csvToObject(csvData);

  var data = [];

  sourceData.forEach(function(row) {
    var values = [];
    dataSchema.forEach(function(field) {
      switch(field.name) {
        case 'date':
          values.push(row.date);
          break;
        case 'nanoseconds':
          values.push(row.nanoseconds);
          break;
        case 'size':
          values.push(row.size);
          break;
        default:
          values.push('');
      }
    });
    data.push({
      values: values
    });
  });

  return {
    schema: dataSchema,
    rows: data
  };

};}

这是将 CSV 数据转换为对象的函数:

 function csvToObject(array) {
    var headers = array[0];

  var jsonData = [];
    for ( var i = 1, length = array.length; i < length; i++ )
    {
      var row = array[i];
      var data = {};
      for ( var x = 0; x < row.length; x++ )
      {
        data[headers[x]] = row[x];
      }
      jsonData.push(data);

    }

    return jsonData;
  }

(它基于here的so-solution ,我对其进行了修改以适合我的源CSV数据)

于 2017-11-07T10:09:52.940 回答