As Title I would like to build data connector just like Two Minute Reports's data connector name "API Bridge - JSON" that provide getting automate generate data field in json form, via API which can use authorization with header Bearer Token, and HttpMethod. I would like to know what do I need for those to build data connector complete.
This is what I try to do. I still manually create data field.
var cc = DataStudioApp.createCommunityConnector();
// Set up authentication type (None in this case)
function getAuthType() {
var AuthTypes = cc.AuthType;
return cc.newAuthTypeResponse().setAuthType(AuthTypes.NONE).build();
}
// Set up configuration options for the connector
function getConfig(request) {
var config = cc.getConfig();
// Text input for API endpoint
config.newTextInput()
.setId('apiEndpoint')
.setName('Enter the API endpoint URL')
// Date range is required for the connector
config.setDateRangeRequired(true);
return config.build();
}
function getFields(request) {
var cc = DataStudioApp.createCommunityConnector();
var fields = cc.getFields();
var types = cc.FieldType;
var aggregations = cc.AggregationType;
fields.newDimension()
.setId('schoolGroup')
.setType(types.TEXT);
fields.newDimension()
.setId('affiliation')
.setType(types.TEXT);
fields.newDimension()
.setId('provinceOfSchoolGroup')
.setType(types.TEXT);
fields.newDimension()
.setId('fullName')
.setType(types.TEXT);
fields.newDimension()
.setId('goalSubmissionSummit')
.setType(types.YEAR_MONTH_DAY_HOUR_MINUTE_SECOND);
fields.newDimension()
.setId('goalID')
.setType(types.NUMBER);
fields.newDimension()
.setId('answerGoal')
.setType(types.TEXT);
fields.newDimension()
.setId('subject')
.setType(types.TEXT);
fields.newDimension()
.setId('answerClass')
.setType(types.TEXT);
fields.newDimension()
.setId('lineName')
.setType(types.TEXT);
fields.newDimension()
.setId('userID')
.setType(types.NUMBER);
fields.newDimension()
.setId('school')
.setType(types.TEXT);
fields.newDimension()
.setId('provinceOfTeacher')
.setType(types.TEXT);
fields.newDimension()
.setId('reflectForm1')
.setType(types.NUMBER);
fields.newDimension()
.setId('reflectForm2')
.setType(types.NUMBER);
fields.newDimension()
.setId('reflectForm3')
.setType(types.NUMBER);
fields.newDimension()
.setId('landingFormSummit')
.setType(types.YEAR_MONTH_DAY_HOUR_MINUTE_SECOND);
fields.newDimension()
.setId('link')
.setType(types.URL);
// Student Feedback Fields
fields.newDimension()
.setId('totalStudentFeedback')
.setType(types.NUMBER);
fields.newDimension()
.setId('studentFeedbackLevel')
.setType(types.TEXT);
return fields;
}
function getSchema(request) {
var fields = getFields(request).build();
return { schema: fields };
}
function responseToRows(requestedFields, response) {
var row = [];
requestedFields.asArray().forEach(function (field) {
switch (field.getId()) {
case 'schoolGroup':
row.push(response.schoolGroup);
break;
case 'affiliation':
row.push(response.affiliation);
break;
case 'provinceOfSchoolGroup':
row.push(response.provinceOfSchoolGroup);
break;
case 'fullName':
row.push(response.fullName);
break;
case 'goalSubmissionSummit':
row.push(response.goalSubmissionSummit);
break;
case 'goalID':
row.push(response.goalID);
break;
case 'answerGoal':
row.push(response.answerGoal);
break;
case 'subject':
row.push(response.subject);
break;
case 'answerClass':
row.push(response.answerClass);
break;
case 'lineName':
row.push(response.lineName);
break;
case 'userID':
row.push(response.userID);
break;
case 'school':
row.push(response.school);
break;
case 'provinceOfTeacher':
row.push(response.provinceOfTeacher);
break;
case 'reflectForm1':
row.push(response.reflectForm1);
break;
case 'reflectForm2':
row.push(response.reflectForm2);
break;
case 'reflectForm3':
row.push(response.reflectForm3);
break;
case 'landingFormSummit':
row.push(response.landingFormSummit);
break;
case 'link':
row.push(response.link);
break;
case 'totalStudentFeedback':
row.push(response.studentFeedback[0].totalStudentFeedback);
break;
case 'studentFeedbackLevel':
row.push(response.studentFeedback[0].studentFeedbackLevel);
break;
}
});
return { values: row };
}
function getData(request) {
var requestedFieldIds = request.fields.map(function (field) {
return field.name;
});
var requestedFields = getFields().forIds(requestedFieldIds);
// Fetch and parse data from API
var apiUrl = request.configParams.apiEndpoint;
var token = "eyJh...";
var options = {
method:"GET",
contentType:'application/json',
headers:{Authorization:"Bearer "+ token},
muteHttpExceptions:true
};
var response = UrlFetchApp.fetch(apiUrl, options);
var parsedResponse = JSON.parse(response.getContentText());
var rows = responseToRows(requestedFields, parsedResponse);
return {
schema: requestedFields.build(),
rows: [rows]
};
}