Por fin podemos hablar de macros en la hoja de cálculo de Google, esa parte de líneas de código que pueden automatizar ciertos procesos para facilitarnos la vida ha llegado con el nombre de scripts.google.
Vamos desde el principio.
Para poder hacer uso de los scripts de Google sheet podemos acceder a través de nuestra hoja de cálculo en el menú Herramientas>Macros>Grabar Macro.

Cuando presionemos la opción Grabar Macro nos aparecerá un menú en la parte inferior de la hoja parecido a este.

Mucho ojo aquí que ya esta grabándose la macro y tendremos que ejecutar los pasos a la perfección:
- Selecciona la celda A1
- Escribe la palabra “Hola mundo”
- Presiona enter
- Presiona el botón “Guardar” en el menú de la parte inferior.
Una vez realizado esto, Google nos preguntará que nombre queremos que tenga la macro y si necesitamos un comando numérico para entrar a la misma, designa el numero 1 y tu macro habrá quedado guardada.

Que hay con el editor…
Ya que tengas tu macro guardada podrás ingresar a ver el código de esta usando el editor de scripts que encontraras nuevamente en Herramientas>Editor de secuencia.

Una vez presionemos ahí veras que se despliega una nueva ventana en el explorador con la cual podrás acceder a lo que acabas de grabar y modificarlo.

Algo más divertido.
Dentro del editor, pega el siguiente código debajo del que acabas de grabar.
function holaMundoCute(){
var spreadsheet = SpreadsheetApp.getActive();
var saludo = Browser.inputBox(‘Escribe tu nombre aqui’);
Browser.msgBox(‘Hola ‘ + saludo + ‘, como va el mundo?’);
}
Después, presiona el botón guardar en la barra de herramientas del editor de código y en el menú desplegable que dice “selecciona función” selecciona la nueva macro que acabamos de escribir seguido del botón play 4 y mira lo que ocurre.

Falta mucho por explorar en las macros de Google que se muestran como una solución increíble para compartir libros y ejecutar macros en conjunto, por lo que ahora si es posible que Excel tenga un rival digno jeje. Nos leemos en los comentarios.
quisiera pasar ese codigo de macro a google sheets, alguien sabe como quedaria?
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range
‘Ajustar la referencia al rango deseado
Set rng = Range(«D3:D150»)
If Not Intersect(Target, rng) Is Nothing Then
Target.Offset(0, 3) = Time ‘Para hora solamente
Target.Offset(0, 4) = Date ‘Para fecha solamente
End If
End Sub
Hola Juan.
El codigo queda asi.
function onEdit(e) {
var rChange = e.range;
var rowChange = rChange.getRow();
var colChange = rChange.getColumn();
var nDate = new Date();
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
/** Cambia estas variables por el rango a usar */
var hoja = spreadsheet.getSheetByName(«Sheet1»);
var rng1 = hoja.getRange(«D2»);
var rng2 = hoja.getRange(«D150»);
if(rowChange >= rng1.getRowIndex() && rowChange <= rng2.getRowIndex() && colChange >= rng1.getColumn() && colChange <= rng2.getColumn()){ rChange.offset(0,3).setValue(nDate.toLocaleTimeString()); rChange.offset(0,4).setValue(nDate.toLocaleDateString()); } } Cualquier duda, estoy a la orden en svallejo@excelcute.com
Saludos.
Querría pasar esta macro de excel a google sheets y soy incapaz… alguien sabría cómo hacerlo?
Sub Mostrar_meses()
‘ Mostar meses correspondientes
Columns(«B:NI»).Hidden = True
Range(Columns(Range(«A9»).Value * 31 – 29), Columns(Range(«A9»).Value * 31 + 1)).Hidden = False
End Sub
Gracias!
Hola Lonso.
Queda más o menos así:
function Mostrar_meses(){
var ss = SpreadsheetApp.getActive();
var nSheet = ss.getSheetByName(‘hoja actividades’);
var mes = nSheet.getRange(‘A9’).getValue();
nSheet.hideColumns(nSheet.getRange(‘B:NI’).getColumn(),nSheet.getRange(‘B:NI’).getNumColumns());
nSheet.showColumns(mes * 31 – 29, mes * 31 + 1);
}
Cualquier duda, puedes escribirme a svallejo@excelcute.com
Saludos!
Hola, buen día.
Yo tengo una macros en excel y no sé si haya posibilidad de exportarla a Google Sheets, o si tengo que realizarla de nuevo, cómo lo podría hacer ya que soy nuevo en esto.
Saludos.
Hola Monserrat!
No hay forma natural de exportar la macro, habría que recrearla. Lo siento 🙁
Si requieres ayuda para hacerlo, puedes escribirme a svallejo@excelcute.com.
Saludos!
Buena Tardes, quiero pasar esta macro de Excel a Hoja de Cálculo de Google. Si alguién me puede ayudar. Muchas gracias.
Sub unionhojas()
ultimf = Range(«A» & Cells.Rows.Count).End(xlUp).Row + 1
For hoja = 2 To Sheets.Count
Sheets(hoja).Select
ufh = Range(«A» & Cells.Rows.Count).End(xlUp).Row
Range(«A2:E» & ufh).Copy
Sheets(«Union»).Select
ultimf = Range(«A» & Cells.Rows.Count).End(xlUp).Row + 1
Range(«A» & ultimf).PasteSpecial Paste:=xlPasteAll
Next hoja
MsgBox («Fin preceso informacion unida»)
End Sub
Hola Peter.
Algo asi te puede servir (recurda cambiar los << por comillas): function unionhojas(){ var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var sheets = spreadsheet.getSheets(); var union = spreadsheet.getSheetByName("Union"); for(var i = 1; isvallejo@excelcute.com
Hola, tengo un script con bastantes funciones. Scrapea datos de webs de bolsa y luego debe generar archivos txt que almacena en mi drive. Cómo puedo saber qué activadores son los que debo programar? . Existe algún script que agrupe los activadores necesarios y se pongan a funcionar?
Saludos
Luis
Hola Luis.
No, por desgracia no existe uno, solo se me ocurre programar un Script padre que agrupe todas tus funciones según tu proceso. Los activadores irían arrancando según este código padre.
Para revisar la lista de activadores, puedes checar https://script.google.com. con tu cuenta y en «Activadores» ver cuales ya tienes y cuales hacen falta.
No sé si entendí bien tu pregunta, pero si tienes más dudas puedes preguntar a svallejo@excelcute.com
Hola buenas tardes!
No se si me pudieras apoyar quisiera convertir el código de esta macro de excel a google sheets
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = «$C$2» Then
Call macro2
End Sub
Hola.
El código queda así:
function onEdit(e) {
var rChange = e.range;
var rowChange = rChange.getRow();
var colChange = rChange.getColumn();
if(rowChange == 2 && colChange == 3){
myFunction2;
}
Cualquier duda estamos en contacto por svallejo@excelcute.com
Hola, necesito ayuda, quiero hacer que por ejemplo en la celda A1 aparece cualquier texto, en la celda B2 aparezca la fecha y la hora y que no sea volatil. En Excel me funciona con esta macro, pero no logro hacer que me funcione en SHEETS… porfa ayuda!!
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim rCell As Range
Dim rChange As Range
On Error GoTo ErrHandler
Set rChange = Intersect(Target, Range(«D:D»))
If Not rChange Is Nothing Then
Application.EnableEvents = False
For Each rCell In rChange
If rCell > «» Then
With rCell.Offset(0, 1)
.Value = Now
.NumberFormat = «hh:mm:ss dd-mm-yy»
End With
Else
rCell.Offset(0, 1).Clear
End If
Next
End If
ExitHandler:
Set rCell = Nothing
Set rChange = Nothing
Application.EnableEvents = True
Exit Sub
ErrHandler:
MsgBox Err.Description
Resume ExitHandler
End Sub
Gracias!
Hola Anibal.
Espero la respuesta que tuvimos haya sido satisfactoria 😀
Hola.
¿Como puedo abrir desde gas un fichero excel subido a Drive?
Lo intento por su Id, su Url por file pero no lo consigo.
¿Que hago mal?
function abrirExcel (){
var ss = SpreadsheetApp.openById(id)
o
var ss =SpreadsheetApp.openByUrl(url)
o
var ss =SpreadsheetApp.open(file)
Logger . log ( ss . getName ());
}
Hola Eduardo.
¿Cuál es el error que te marca?
– Si es un error de no encontrar el URL o Id es porque al parecer puede ser un tema de permisos.
– Si solo no te muestra el archivo es porque los métodos open del objeto SpreadsheetApp no abren físicamente los libros, solo a nivel memoria.
Si gustas más ayuda escríbeme a svallejo@excelcute.com 😀
Hola!
Necesito convertir esta macro de Excel a Google Sheets
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 23 Then
Cells(Target.Row, 24).Value = Now
End If
desde ya gracias!
End Sub
Hola Braulio.
El codigo quedaria mas o menos asi:
function onEdit(e) {
var range = e.range;
var col = range.getColumn();
if(col == 23)
{
var cell = range.offset(0,1);
cell.setValue(new Date());
}
}
Saludos!
Buen post, consulta; como grabo una macro para poder exportar una hoja de cálculo cada cierto tiempo?
Hola Omar.
Con la grabadora de Macros será imposible registrar ese procedimiento 🙁
Tendrías que crear el procedimiento desde 0 con líneas de comando, te dejo un ejemplo muy bueno para que puedas revisar la estructura y adecuarlo a tus necesidades 😀
Exportar libro de google
En mi Google Sheet no tengo boton de Macrosen Herramientas.
Cómo puedo insertar este boton de Macros en mi Google Sheet?
Muchas gracias
Hola Rolando.
Solo en GSheet en la red, revisa en la ficha Herramientas. En ese parte debes tener ya sea la opción «Editor de secuencia de Comandos» o la opción «Macros».
hola, tengo una consulta. Tengo un archivo hecho en mi compu con macros y demás, pero al cargar en drive y luego otros usuarios no pueden ver esos macros, solo se carga como archivo común de excel no se si me explico. ¿Qué podrá ser?
Hola Noe.
Puede haber muchas razones por las que esto ocurra:
– Revisa que tu archivo se guarde en extension .xlsm
– Si los usuarios lo abren en Excel en la Web no les sera posible usar macros
– Si tienes una macro que arranca de inicio revisa que se otorguen permisos con la opcion «Permitir macros»
– Si al arrancar la macro no funciona, pero el codigo aun se ve en el Explorador VBA, seguramente habra que agregar algun certificado de seguridad a la carpeta OneDrive https://support.microsoft.com/en-us/office/add-remove-or-change-a-trusted-location-7ee1cdc2-483e-4cbb-bcb3-4e7c67147fb4?ui=en-us&rs=en-us&ad=us
– Si estas usando controles ActiveX lo mas probable es que nunca los puedan ver los usuarios.
Si nada de eso te aparece como una solucion, vuelve a escribirme y buscamos que mas podria ser.
Saludos.
No me aparece en mi hoja de cálculo activado para hacer macros? Que debo hacer? Gracias
Hola Jhosa! Si es una hoja compartida revisa que tengas los permisos suficientes.
Si es una hoja propia, deberia de aparecer la opcion en la ficha «Herramientas», ya sea que lo actives con el boton «Grabador de Macros» o con el boton «Editor de secuencia de comandos».
Si gustas te comparti el libro de ejemplo para que lo edites, debes tenerlo en tu correo.
Saludos!
Buen dia.
estoy haciendo unas listas de personas que deben entregar varias actividades, las actividades estan en un menu desplegable, mi pregunta es como hago para ir guardando cada actividad a entregar si una persona me debe varias actividades…?
hay alguna funcion o macroo que me ayude ir grabando cada actividad y poder escogerle otra pendiente.
gracias
Hola Silvio!
No hay una funcion construida para ir haciendo esto como tal. Tal vez podrias crear un procedimiento como el que te comparto abajo para ir registrando actividad por actividad y guardarla en una hoja control. Espero te sirva.
/** Global Variables */
/** Guarda aqui los nombres de tus hojas y la columna donde iniciara tu historico*/
var NameSheetCur = «hoja actividades»;
var NameSheetData = «historico actividades»;
var colInit = ‘A:A’
/** Funcion para crear historico de actividades*/
function createHistoryofActivities() {
var ss = SpreadsheetApp.getActive();
var history = ss.getSheetByName(NameSheetData);
var fillData = ss.getSheetByName(NameSheetCur);
var namePerson = fillData.getRange(3,1).getValue();
var activity = fillData.getRange(3,2).getValue();
/** Usa la funcion getLastRowSpecial para traer la ultima fila de tu documento*/
var columnCheck = history.getRange(colInit).getValues();
var lastRow = getLastRowSpecial(columnCheck);
/** Copia los datos en el historico */
history.getRange(lastRow,1).setValue(namePerson);
history.getRange(lastRow,2).setValue(activity);
history.getRange(lastRow,3).setValue(new Date());
/** borra los datos originales para generar un nuevo registro */
fillData.getRange(3,1).setValue(«»);
fillData.getRange(3,2).setValue(«»);
};
/** —————————————————————————————-/*
/* Funcion utilitaria para tomar la ultima fila de un libro */
function getLastRowSpecial(range) {
var rowNum = 0;
var blank = false;
for(var row = 0; row < range.length; row++){ if(range[row][0] === "" && !blank){ rowNum = row; blank = true; }else if(range[row][0] !== ""){ blank = false; }; }; return rowNum + 1; };
Hola consulto. Tengo un documento google sheets en el que en una hoja le echo un pequeño formulario de carga de datos. Con una macro guardo esos datos en otra hoja del mismo documento, pongo en blanco el formulario y me vuelvo a posicionar en la primer celda para volver a cargar los datos. La verdad es que funciona muy bien y me resulto sencillo generar la macro mediante el grabador de macros. Ahora bien el paso siguiente que quería hacer era proteger la hoja en donde se vuelcan los datos del formulario para que sea solo de lectura.El problema que tengo es que si protejo esa hoja el macro no funciona porque se encuentra con que no tiene permisos para modificarla y no he dato con la tecla de como resolver ese inconveniente. Se podrá resolver?
Hola Julian.
Desafortunadamente el metodo para desproteger hojas no existe para gsheets.
Lo que si puedes hacer es, en lugar de proteger una hoja, proteger el rango que modificas ya que esa propiedad si se puede pasar dentro de la macro.
Al principio de tu codigo puedes insertar para desproteger el rango con tu hoja seleccionada:
protection.remove();
Y antes de finalizar tu macro
var protection = spreadsheet.getRange(‘A:K’).protect();
Espero te sirva 😀
Quiero pasar esta MACRO EN EXCEL a google sheets alguien me puede colaborar
:
Sub DOC_CCIAL()
Dim A As Double
Dim B As Double
Dim i As Integer
Dim j As Integer
Dim CUENTA As Double
Dim celda_CantidadDocCcial As Range
Dim DOC_CCIAL As Range
NroFila0 = ActiveCell.Row
NroColumna0 = ActiveCell.Column
NroFila1 = ActiveCell.Row
NroColumna1 = ActiveCell.Column
Set celda_CantidadDocCcial = Application.InputBox(prompt:=»INGRESE EL TOTAL DEL MATERIAL», Title:=»MATERIAL», Type:=8)
‘ Sheets(«DOC CCIAL»).Select
Set DOC_CCIAL = Application.InputBox(prompt:=»INGRESE EL DOC CCIAL», Title:=»DOCUMENTOS COMERCIALES», Type:=8)
‘ A = Cells(NroFila0, NroColumna0).Value
If (celda_CantidadDocCcial > A) Then
B = Cells(NroFila0, NroColumna1).Value
CUENTA = celda_CantidadDocCcial – A
For i = 1 To 500
If (CUENTA > B) And (B Empty) Then
NroColumna1 = ActiveCell.Column
CUENTA = CUENTA – B
‘MsgBox «CUENTA » & CUENTA
Cells(NroFila0, NroColumna1 + 1).Value = CUENTA
Cells(NroFila0, NroColumna1 + 2).Value = DOC_CCIAL
NroFila0 = ActiveCell.Row + i
B = Cells(NroFila0, NroColumna1).Value
Else
End If
Next i
Else
End If
End Sub
MACRO EN GOOGLE SHEETS
function CCIAL() {
var A = 0;
var i = 0;
var j = 0;
var CUENTA = 0;
var celda_CantidadDocCcial = 0;
var DOC_CCIAL = 0;
var hojaCalculo= SpreadsheetApp.getActiveSpreadsheet();
var hojaDatos= hojaCalculo.getSheetByName(‘CONSOLIDADO 2020’);
var NroColumna0 = SpreadsheetApp.getActiveSheet().getLastRow();
var NroFila0 = SpreadsheetApp.getActiveSheet().getLastRow();
var NroFila1 = SpreadsheetApp.getActiveSheet().getLastRow();
var NroColumna1 = SpreadsheetApp.getActiveSheet().getLastRow();
var rango = SpreadsheetApp.getActive().getRangeByName(«miCelda»);
var row = hojaDatos.getRange(1, 1, NroFila0, NroColumna0).getValues();
celda_CantidadDocCcial = Browser.inputBox(«MATERIAL»,»INGRESE EL TOTAL DEL MATERIA», Browser.Buttons.OK_CANCEL);
DOC_CCIAL = Browser.inputBox(«MATERIAL»,»INGRESE EL TOTAL DEL MATERIAL», Browser.Buttons.OK_CANCEL);
if (celda_CantidadDocCcial > A) {
var B = 0;
B = (NroFila0, NroColumna1).Value
CUENTA = celda_CantidadDocCcial – A
for (var i = 1; i B) {
NroColumna1 = ActiveCell.Column
CUENTA = CUENTA – B
CUENTA = (NroFila0, NroColumna1 + 1).value
DOC_CCIAL = (NroFila0, NroColumna1 + 2).value
NroFila0 = ActiveCell.Row + i
B = (NroFila0, NroColumna1).value
Else
}
}
Else
}
}