Macros en hojas de cálculo de Google.

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:

  1. Selecciona la celda A1
  2. Escribe la palabra “Hola mundo”
  3. Presiona enter
  4. 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.

Macros en hojas de cálculo de Google.

32 comentarios en «Macros en hojas de cálculo de Google.»

  1. 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

    1. 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.

  2. 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!

    1. 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!

  3. 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.

  4. 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

    1. 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

  5. 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

    1. 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

  6. 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!

  7. 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 ());
    }

    1. 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 😀

  8. 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

    1. 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!

  9. En mi Google Sheet no tengo boton de Macrosen Herramientas.
    Cómo puedo insertar este boton de Macros en mi Google Sheet?

    Muchas gracias

    1. 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».

      opcion de macros

  10. 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?

    1. 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.

    1. 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!

  11. 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

    1. 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; };

  12. 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?

    1. 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 😀

  13. 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
    }
    }

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll hacia arriba