Created
November 28, 2023 03:55
-
-
Save duynhm/76a02435da740654579e9f49671a65fc to your computer and use it in GitHub Desktop.
Connect AirTable for Talent Pool to Google Sheet with App Script
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var API_KEY = ""; | |
function onOpen() { | |
var ui = SpreadsheetApp.getUi(); | |
// Or DocumentApp or FormApp. | |
ui.createMenu('Integrate') | |
.addItem('Get Requests', 'getRequest')//x | |
.addItem('Get Position', 'getPosition')// | |
.addItem('Get Progress', 'getProgress')//x | |
.addItem('Get Department', 'getDept')//x | |
.addItem('Get Employee', 'getEmp')//x | |
.addToUi(); | |
} | |
//========================================================== REQUEST ==================================================================== | |
function getRequest() {//x | |
getRequestNext(null, 0); | |
} | |
function getRequestNext(offset, page){ | |
var response = ""; | |
if(!offset) | |
{ | |
response = UrlFetchApp.fetch('https://api.airtable.com/v0/tMlyHvTph/Request?api_key='+API_KEY); | |
clean("Requests"); | |
} | |
else | |
response = UrlFetchApp.fetch('https://api.airtable.com/v0/tMlyHvTph/Request?api_key='+API_KEY+"&offset="+offset); | |
var data = JSON.parse(response.getContentText()); | |
fillToRequest(data.records, page); | |
if(data.offset){ | |
getRequestNext(data.offset, page+1); | |
} | |
} | |
function fillToRequest(records, page){ | |
var data = []; | |
var n = records.length; | |
var r; | |
for(var i = 0; i < n; i++) | |
{ | |
r = records[i].fields; | |
// | |
var position = ""; | |
if(typeof r["Position"] !== 'undefined') | |
{ | |
position = r["Position"][0]; | |
for(var j = 1; j < r["Position"].length; j++) | |
{ | |
position += "," + r["Position"][j]; | |
} | |
} | |
// | |
var progress = ""; | |
if(typeof r["Progress"] !== 'undefined') | |
{ | |
progress = r["Progress"][0]; | |
for(var j = 1; j < r["Progress"].length; j++) | |
{ | |
progress += "," + r["Progress"][j] ; | |
} | |
} | |
// | |
var department = ""; | |
if(typeof r["Department"] !== 'undefined') | |
{ | |
department = r["Department"][0]; | |
for(var j = 1; j < r["Department"].length; j++) | |
{ | |
department += "," + r["Department"][j] ; | |
} | |
} | |
// | |
var division = ""; | |
if(typeof r["Division"] !== 'undefined') | |
{ | |
division = r["Division"][0]; | |
for(var j = 1; j < r["Division"].length; j++) | |
{ | |
division += "," + r["Division"][j] ; | |
} | |
} | |
// | |
var requester = ""; | |
if(typeof r["Requester"] !== 'undefined') | |
{ | |
requester = r["Requester"][0]; | |
for(var j = 1; j < r["Requester"].length; j++) | |
{ | |
requester += "," + r["Requester"][j] ; | |
} | |
} | |
// | |
var candidateInfo = ""; | |
if(typeof r["CandidateInfo"] !== 'undefined') | |
{ | |
candidateInfo = r["CandidateInfo"][0]; | |
for(var j = 1; j < r["CandidateInfo"].length; j++) | |
{ | |
candidateInfo += "," + r["CandidateInfo"][j] ; | |
} | |
} | |
// | |
var leadtimeByPosition = ""; | |
if(typeof r["Leadtime by Position"] !== 'undefined') | |
{ | |
leadtimeByPosition = r["Leadtime by Position"][0]; | |
for(var j = 1; j < r["Leadtime by Position"].length; j++) | |
{ | |
leadtimeByPosition += "," + r["Leadtime by Position"][j] ; | |
} | |
} | |
// | |
data.push([records[i].id, | |
(typeof r["Request Code"] === 'undefined'? '': r["Request Code"]), position, | |
(typeof r["Quantity"] === 'undefined'? '': r["Quantity"]), | |
(typeof r["Rercruitment type"] === 'undefined'? '': r["Rercruitment type"]), | |
(typeof r["Request Day"] === 'undefined'? '': r["Request Day"]), | |
(typeof r["Job type"] === 'undefined'? '': r["Job type"]), | |
(typeof r["Recruitment Status"] === 'undefined'? '': r["Recruitment Status"]), progress,department, division,requester,candidateInfo, | |
(typeof r["Leadtime by Req"] === 'undefined'? '': r["Leadtime by Req"]), | |
(typeof r["Team TA"] === 'undefined'? '': r["Team TA"]), | |
(typeof r["Mass-Office"] === 'undefined'? '': r["Mass-Office"]), leadtimeByPosition, | |
(typeof r["Deadline"] === 'undefined'? '': r["Deadline"]), | |
(typeof r["Offered Number"] === 'undefined'? '': r["Offered Number"]), | |
(typeof r["Candidate Number"] === 'undefined'? '': r["Candidate Number"]), | |
(typeof r["Onboard Number"] === 'undefined'? '': r["Onboard Number"]), | |
(typeof r["R1 - Interview Number"] === 'undefined'? '': r["R1 - Interview Number"]), | |
(typeof r["R2 - Interview Number"] === 'undefined'? '': r["R2 - Interview Number"]), | |
(typeof r["R3 - Interview Number"] === 'undefined'? '': r["R3 - Interview Number"]), | |
(typeof r["R1 - Pass Number"] === 'undefined'? '': r["R1 - Pass Number"]), | |
(typeof r["R2 - Pass Number"] === 'undefined'? '': r["R2 - Pass Number"]), | |
(typeof r["R3 - Pass Number"] === 'undefined'? '': r["R3 - Pass Number"]), | |
(typeof r["Direct - Indirect"] === 'undefined'? '': r["Direct - Indirect"]), | |
(typeof r["PIC"] === 'undefined'? '': r["PIC"]), | |
(typeof r["Completed Day"] === 'undefined'? '': r["Completed Day"]), | |
(typeof r["No count"] === 'undefined'? false: r["No count"]) | |
]); | |
} | |
var sheet = SpreadsheetApp.getActive().getSheetByName("Requests"); | |
var range = sheet.getRange("A"+(page*100+2)+":AE"+(page*100 + data.length + 1)); | |
range.setValues(data); | |
} | |
//======================================================== PROGRESS ====================================================================== | |
function getProgress() {//x | |
getProgressNext(null, 0); | |
} | |
function getProgressNext(offset, page){ | |
var response = ""; | |
if(!offset) | |
{ | |
response = UrlFetchApp.fetch('https://api.airtable.com/v0/tMlyHvTph/Progress?api_key='+API_KEY); | |
clean("Progress"); | |
} | |
else | |
response = UrlFetchApp.fetch('https://api.airtable.com/v0/tMlyHvTph/Progress?api_key='+API_KEY+"&offset="+offset); | |
var data = JSON.parse(response.getContentText()); | |
fillToProgress(data.records, page); | |
if(data.offset){ | |
getProgressNext(data.offset, page+1); | |
} | |
} | |
function fillToProgress(records, page){ | |
var data = []; | |
var dataFunctions = []; | |
var n = records.length; | |
var r; | |
for(var i = 0; i < n; i++) | |
{ | |
r = records[i].fields; | |
data.push([records[i].id, | |
(typeof r["Name"] === 'undefined'? '': r["Name"]), | |
(typeof r["Request"] === 'undefined'? '': r["Request"]), | |
(typeof r["Round Interview"] === 'undefined'? '': r["Round Interview"]), | |
(typeof r["Contact"] === 'undefined'? '': r["Contact"]), | |
(typeof r["Interview"] === 'undefined'? '': r["Interview"]), | |
(typeof r["Interview Date"] === 'undefined'? '': r["Interview Date"]), | |
(typeof r["Result"] === 'undefined'? '': r["Result"]), | |
(typeof r["R1 - No. Interview"] === 'undefined'? '': r["R1 - No. Interview"]), | |
(typeof r["R2 - No. Interview"] === 'undefined'? '': r["R2 - No. Interview"]), | |
(typeof r["R3 - No. Interview"] === 'undefined'? '': r["R3 - No. Interview"]), | |
(typeof r["R1 - No. Pass Result"] === 'undefined'? '': r["R1 - No. Pass Result"]), | |
(typeof r["R2 - No. Pass Result"] === 'undefined'? '': r["R2 - No. Pass Result"]), | |
(typeof r["R3 - No. Pass Result"] === 'undefined'? '': r["R3 - No. Pass Result"]), | |
(typeof r["Offer"] === 'undefined'? '': r["Offer"]), | |
(typeof r["Offer Date"] === 'undefined'? '': r["Offer Date"]), | |
(typeof r["No. Offer"] === 'undefined'? '': r["No. Offer"]), | |
(typeof r["Onboard"] === 'undefined'? '': r["Onboard"]), | |
(typeof r["Onboard Date"] === 'undefined'? '': r["Onboard Date"]), | |
(typeof r["No. Onboard"] === 'undefined'? '': r["No. Onboard"]), | |
(typeof r["Dept"] === 'undefined'? '': r["Dept"]), | |
(typeof r["TA"] === 'undefined'? '': r["TA"]) | |
]); | |
dataFunctions.push(["MAXIFS($S$2:$S,$C$2:$C,C"+(page*100+i+2)+")"]); | |
} | |
var sheet = SpreadsheetApp.getActive().getSheetByName("Progress"); | |
var notation = "A"+(page*100+2)+":V"+(page*100 + data.length + 1); | |
var range = sheet.getRange(notation); | |
range.setValues(data); | |
sheet.getRange("AN"+(page*100+2)+":AN"+(page*100 + data.length + 1)).setFormulas(dataFunctions); | |
} | |
//=================================================== POSITION =========================================================================== | |
function getPosition() {//x | |
var response = UrlFetchApp.fetch('https://api.airtable.com/v0/tMlyHvTph/POSITION?api_key='+API_KEY); | |
//Logger.log(response.getContentText()); | |
clean("Position"); | |
fillToPosition(JSON.parse(response.getContentText()).records); | |
} | |
function fillToPosition(records){ | |
var data = []; | |
var n = records.length; | |
var r; | |
for(var i = 0; i < n; i++) | |
{ | |
r = records[i].fields; | |
data.push([records[i].id, | |
(typeof r["Name"] === 'undefined'? '': r["Name"]), | |
(typeof r["Name Vi"] === 'undefined'? '': r["Name Vi"]), | |
(typeof r["Level"] === 'undefined'? '': r["Level"]), | |
(typeof r["Leadtime"] === 'undefined'? '': r["Leadtime"]) | |
]); | |
} | |
var sheet = SpreadsheetApp.getActive().getSheetByName("Position"); | |
var notation = "A2:E"+(data.length + 1); | |
var range = sheet.getRange(notation); | |
range.setValues(data); | |
} | |
//================================================ DEPARTMENT ============================================================================== | |
function getDept() {//x | |
var response = UrlFetchApp.fetch('https://api.airtable.com/v0/tMlyHvTph/Department?api_key='+API_KEY); | |
//Logger.log(response.getContentText()); | |
clean("Department"); | |
fillToDept(JSON.parse(response.getContentText()).records); | |
} | |
function fillToDept(records){ | |
var data = []; | |
var n = records.length; | |
var r; | |
for(var i = 0; i < n; i++) | |
{ | |
r = records[i].fields; | |
data.push([records[i].id, | |
(typeof r["Name"] === 'undefined'? '': r["Name"]), | |
(typeof r["Parent"] === 'undefined'? '': r["Parent"]), | |
(typeof r["Type"] === 'undefined'? '': r["Type"]), | |
(typeof r["Name Vi"] === 'undefined'? '': r["Name Vi"]), | |
(typeof r["Name En"] === 'undefined'? '': r["Name En"]) | |
]); | |
} | |
var sheet = SpreadsheetApp.getActive().getSheetByName("Department"); | |
var notation = "A2:F"+(data.length + 1); | |
var range = sheet.getRange(notation); | |
range.setValues(data); | |
} | |
//================================================ EMPLOYEE ============================================================================== | |
function getEmp() {//x | |
var response = UrlFetchApp.fetch('https://api.airtable.com/v0/tMlyHvTph/Employee?api_key='+API_KEY); | |
//Logger.log(response.getContentText()); | |
clean("Employee"); | |
fillToEmp(JSON.parse(response.getContentText()).records); | |
} | |
function fillToEmp(records){ | |
var data = []; | |
var n = records.length; | |
var r; | |
for(var i = 0; i < n; i++) | |
{ | |
r = records[i].fields; | |
data.push([records[i].id, | |
(typeof r["Name"] === 'undefined'? '': r["Name"]), | |
(typeof r["ID"] === 'undefined'? '': r["ID"]) | |
]); | |
} | |
var sheet = SpreadsheetApp.getActive().getSheetByName("Employee"); | |
var notation = "A2:C"+(data.length + 1); | |
var range = sheet.getRange(notation); | |
range.setValues(data); | |
} | |
//======================================================================= | |
function clean(sheetName){ | |
var sheet = SpreadsheetApp.getActive().getSheetByName(sheetName); | |
switch(sheetName){ | |
case "Requests": | |
sheet.getRange("A2:AE").clear(); | |
break; | |
case "Progress": | |
sheet.getRange("A2:V").clear(); | |
sheet.getRange("AN2:AN").clear(); | |
break; | |
case "Position": | |
sheet.getRange("A2:E").clear(); | |
break; | |
case "Department": | |
sheet.getRange("A2:E").clear(); | |
break; | |
case "Employee": | |
sheet.getRange("A2:C").clear(); | |
break; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment