Two Minute Reports's data connector name "API Bridge - JSON"

40 views
Skip to first unread message

Nattapol Srirakkullatad

unread,
Jul 19, 2023, 1:26:14 AM7/19/23
to Google Apps Script Community
Hello, there 

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. Thank you in advance

 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')
.setHelpText('e.g. https://example.com/api')
.setPlaceholder('https://example.com/api');

// 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]
};
}

Reply all
Reply to author
Forward
0 new messages