Google apps script 使用自定义连接器时,DataStudio返回随机错误id

Google apps script 使用自定义连接器时,DataStudio返回随机错误id,google-apps-script,google-data-studio,Google Apps Script,Google Data Studio,我正在使用script.google.com创建一个自定义连接器,可以从drive.google.com读取CSV数据并将数据发送到google data studio 当运行连接器并在DataStudio中插入一个简单表时,我收到一个简单消息,由于服务器错误,请求无法处理。每次我“重新发布”脚本时,错误id都在更改 这是 function getData(request) { var dataSchema = []; request.fields.forEach(function(

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

当运行连接器并在DataStudio中插入一个简单表时,我收到一个简单消息,由于服务器错误,请求无法处理。每次我“重新发布”脚本时,错误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
  };
};
这是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?我的脚本有什么问题吗?

您应该只返回
请求中包含的字段/列。当前,
data
包含
csvFile
中的所有字段。根据仪表板中的图表元素,
request
很可能只包含完整架构的一个子集。看


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

@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;
  }
函数csvToObject(数组){
变量头=数组[0];
var jsonData=[];
for(变量i=1,长度=array.length;i

(它基于来自的so解决方案,我对其进行了修改以适合我的源CSV数据)

从我的角度来看,结果符合请求模式。我在问题中添加了更详细的信息。此外,很明显,返回结果时会发生错误,我在该行之前登录到控制台。但是我会检查一下示例实现,也许这会导致我所做的错误。感谢您发布更多信息。这实际上消除了混淆-您的
getData()
请求只包含
date
size
。这反映在通过
getData()
返回的模式中。但是,
包含所有三个字段的值。如果您按顺序过滤并仅传回请求的字段,则应该可以解决问题。我在回答中提到的例子应该有助于解决这个问题。这就引出了解决方案,我理解你的意思。在DataStudio中添加第三列后,错误消失了。谢谢不客气!我很高兴它成功了!请随意贡献您的代码,以便其他用户可以从中受益!我肯定会的,需要在之前把它清理干净并记录下来。
 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;
  }