Created
July 31, 2018 16:38
-
-
Save lucis/799aa3aeccbc63cfd0fd7f0811905601 to your computer and use it in GitHub Desktop.
Script para Google Planilhas para processar um CSV sobre dados de aulas e popular uma planilha personalizada da coordenação
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
// Google Scripts não suporta ES6 ;( | |
/** | |
* Script para preenchimento da planilha de Horários para o curso de Computação na UFCG, a partir de um CSV com os dados. | |
* | |
* Abaixo devem se colocados os nomes das planilhas onde estão os dados e onde deverá ficar o horário processado. | |
* Também o range de celúlas que o script irá limpar antes de realizar o processamento. | |
* | |
* Modelo da planilha: bit.ly/horario20182 | |
* | |
* Autor: Luciano Júnior ([email protected]) | |
* (@luciannojunior no Linkedin) | |
* | |
*/ | |
var PLANILHA_DADOS = 'Base de Dados'; | |
var PLANILHA_HORARIO = 'Horário 2018.2'; | |
var RANGE_LIMPAVEL = 'B7:AD88'; | |
var COLUNAS_DIAS = { | |
s: 'B', | |
t: 'H', | |
q: 'N', | |
i: 'T', | |
x: 'Z' | |
}; | |
var LINHAS_HORARIOS = { | |
'07': 3, | |
'08': 7, | |
'10': 25, | |
'14': 45, | |
'16': 64, | |
'18': 82, | |
'20': 88 | |
}; | |
function leDados(){ | |
// Seleciona a planilha com os dados brutos do CSV | |
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(PLANILHA_DADOS); | |
var values = sheet.getDataRange().getValues(); | |
var aulas = []; | |
// Não considera a primeira linha, dos cabeçalho, e itre sobre elas organizando as turmas em um dicionário (objeto) | |
for (var i = 1; i < values.length; i++) { | |
var linha = values[i]; | |
var aula = {}; | |
aula.sala = linha[0]; | |
aula.nome = linha[1]; | |
aula.prof = linha[2]; | |
aula.tipo = linha[3]; | |
aula.periodo = linha[4]; | |
aula.dia = linha[5][0]; | |
aula.horario = linha[5].substring(1,3); | |
aulas.push(aula); | |
} | |
return aulas; | |
} | |
/** | |
* Limpa os dados das disciplinas na planilha. | |
*/ | |
function limpaDados() { | |
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(PLANILHA_HORARIO); | |
var values = sheet.getRange(RANGE_LIMPAVEL).setValue(''); | |
} | |
/** | |
* Recupera, de acordo com o número de aulas que já estão preenchidas no mesmo slot, | |
* a célula onde a próxima aula deve ser inserida (a inicial, na verdade) | |
*/ | |
function getA1paraAula(aula, count_preenchidas){ | |
var slot = aula.dia + aula.horario; | |
if (!count_preenchidas[slot]){ | |
count_preenchidas[slot] = 0; | |
} | |
var coluna = COLUNAS_DIAS[aula.dia]; | |
var linha = LINHAS_HORARIOS[aula.horario] + count_preenchidas[slot]++; | |
return [coluna.charCodeAt(), linha] ; | |
} | |
// Função necessária para processar colunas com duas letra (ex: AA, AB) | |
// Para o fim dessa planilha, considera que nunca ultrapassará AD | |
function getColuna(charCode) { | |
if (charCode <= 90) return String.fromCharCode(charCode) | |
return "A" + String.fromCharCode(charCode - 26); | |
} | |
/** | |
* Preenche os dados de uma aula específica | |
*/ | |
function preencheAula(aula, count_preenchidas) { | |
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(PLANILHA_HORARIO); | |
var primeiraCelula = getA1paraAula(aula, count_preenchidas); | |
var valores = [aula.sala, aula.nome, aula.prof, aula.tipo, aula.periodo]; | |
for (i in valores){ | |
sheet.getRange(getColuna(primeiraCelula[0]++) + primeiraCelula[1]).setValue(valores[i]); | |
} | |
} | |
function main() { | |
limpaDados() | |
var aulas = leDados(); | |
// Conta quantas disciplinas já foram inseridas em casa slot (s08: 0, t10: 2...) | |
var count_preenchidas = {}; | |
for (i in aulas) { | |
var aula = aulas[i]; | |
preencheAula(aula, count_preenchidas); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment