DataStudio returns 使用自定义连接器时的随机错误 ID
DataStudio returns random error id when using custom connector
我正在使用 script.google.com 创建一个自定义连接器,它可以从 drive.google.com 读取 CSV 数据并将数据发送到 Google 的数据工作室。
当 运行 连接器并在数据工作室中插入一个简单的 table 时,我收到一个简单的消息,指出由于服务器错误而无法处理请求。每次我 "re-publish" 脚本时,错误 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"]}]}
非常适合to the reference。我正在提供更多信息,但无论如何按照教程应该可以。
这些是请求中提供的字段:
这就是 getDate returns:
所以,我首先想知道的是:为什么会出现随机错误id?我的脚本可能有什么问题?
您只应 return fields/columns 包含在 request
中。当前,data
包含 csvFile
中的所有字段。根据仪表板中的图表元素,request
很可能只包含完整架构的一个子集。参见 example implementation at the Data Studio Open Source repo。
如果这不能解决问题,您应该设置 error handing 并检查错误是否发生在任何特定行。
@Minhaz Kazi 给出了缺失的提示:
因为我没有 "dynamically" 填写 getData 中的响应对象,所以我总是 return 所有三列。
使用上面的代码,我唯一需要做的就是将第三列添加为维度或指标。
所以我将代码更改为动态 return 列,以便它适合响应。为此,我必须实现一个将 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 的解决方案,我对其进行了修改以适合我的源 CSV 数据)
我正在使用 script.google.com 创建一个自定义连接器,它可以从 drive.google.com 读取 CSV 数据并将数据发送到 Google 的数据工作室。
当 运行 连接器并在数据工作室中插入一个简单的 table 时,我收到一个简单的消息,指出由于服务器错误而无法处理请求。每次我 "re-publish" 脚本时,错误 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"]}]}
非常适合to the reference。我正在提供更多信息,但无论如何按照教程应该可以。
这些是请求中提供的字段:
这就是 getDate returns:
所以,我首先想知道的是:为什么会出现随机错误id?我的脚本可能有什么问题?
您只应 return fields/columns 包含在 request
中。当前,data
包含 csvFile
中的所有字段。根据仪表板中的图表元素,request
很可能只包含完整架构的一个子集。参见 example implementation at the Data Studio Open Source repo。
如果这不能解决问题,您应该设置 error handing 并检查错误是否发生在任何特定行。
@Minhaz Kazi 给出了缺失的提示:
因为我没有 "dynamically" 填写 getData 中的响应对象,所以我总是 return 所有三列。
使用上面的代码,我唯一需要做的就是将第三列添加为维度或指标。
所以我将代码更改为动态 return 列,以便它适合响应。为此,我必须实现一个将 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 的解决方案,我对其进行了修改以适合我的源 CSV 数据)