Skip to content

Instantly share code, notes, and snippets.

@lucis
Created July 31, 2018 16:38
Show Gist options
  • Save lucis/799aa3aeccbc63cfd0fd7f0811905601 to your computer and use it in GitHub Desktop.
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
// 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 (luciannojunior@gmail.com)
* (@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