GPT4Sheets Gratis

Buenas a todos! Traigo una Alternativa a GPT4Sheets pero “Gratis”, si si… has escuchado bien: GRATIS

Y es que el Complemento para Google Sheets era demasiado valioso para que lo dejasen gratuito… Pero Gracias a Claude Sonnet y a mi Amigo Kuron, hemos podido sacar un Script para AppScripts de Sheets con el que puedes hacer lo mismo que con GPT 4 Sheets pero de forma ilimitada y gratuita!

Auto Quizz by Mr.Man-IA

Antes de nada, si no nada de GPT for Sheets te respondo a las preguntas que debes tener ahora mismo en la cabeza de forma Rápida y sin tapujos:

¿Que es GPT 4 Sheets?

GPT4Sheets es un Complemento para Google Sheets el cual te permite integrar GPT en Sheets, pudiendo introducir Prompts que se relacionan con las celdas o rangos que le indiques y te devuelve la Respuesta.

Herramienta para Encontrar Nichos Rentables en YoutubeHerramienta para Encontrar Nichos Rentables en Youtube

También te permite crear imágenes con Dalle en Google Sheets y obtener el enlace para hacer lo que necesites con ella.

¿Cuanto Cuesta GPT 4 Sheets?

A día de hoy (27 de Julio de 2024) Tiene 3 planes:

Validador de Correos Electrónicos GratisValidador de Correos Electrónicos Gratis
  1. GPT4Sheets Plan Individual: 29$/mes (3.5millones de palabras y 250 imágenes)
  2. GPT4Sheets Plan Professional : 99$/mes (10millones de palabras y 750 imágenes)
  3. GPT4Sheets Plan Enterprise: 499$/mes (50millones de palabras y 3500 imágenes)

Si utilizas el Script que te proporciono te costará 0$

¿Como Tener GPT4Sheets Gratis?

Tal como explico en el vídeo tienes que copiar y pegar los códigos en tu APPScript, una vez los tengas guardas el proyecto, reinicias la pantalla de tu Sheets y te saldrá un menú con las opciones. Los pasos son los siguientes:

  1. Abrir una nueva hoja de cálculo de Google
  2. Clickar en Extensiones -> Apps Script
  3. Una vez en Apps Script crear un nuevo archivo en formato html llamado: ‘ParametersDialog’
  4. Dentro del archivo ParametersDialog pega el código que encontrarás al final de éste artículo y guarda el archivo
  5. Crea un nuevo archivo Apps Script llamado ‘GPT’
  6. Copia y pega el código que encontrarás al final de éste artículo y guarda el archivo.
  7. Una vez tengas los archivos vuelve a tu hoja de cálculo y dale a f5 para refrescar la ventana, se te abrirá una opción en el menú nueva llamada ‘GPT-3/4 & DALL-E’
  8. Si clickas en ésta nueva parte, podrás añadir tu API Key, y configurar los parámetros que desees (Modelo de Lenguaje, Temperatura, Tokens..)

¿Como se Usa GPT4 Sheets Gratis?

Bien, ahora que ya tienes configurado tu GPT4Sheets tuneado, es hora de hacerlo usar!!

Puedes utilizarlo de muchas formas pero las principales son las que te pondré, siempre tienes que ingresar en una celda la fórmula que vayas a utilizar, depende de si necesitas texto solo de una celda, de un rango o imágenes pues se hace de una manera u otra. Pero no te asustes que es muy fácil..

  1. Texto (Solo tomando una celda como referencia): =GPTFormula(“Prompt”;Celda)
    En la fórmula tenemos un signo de igual (Llama a la funcion) seguido de el nombre de la función (GPTFormula) seguido de paréntesis. todo ésto lo que hace es llamar a la función para que dentro de los paréntesis indicarle lo siguiente.
    Dentro de los paréntesis encontramos por un lado y entrecomillas el prompt que vamos a utilizar, separado por punto y coma de la celda que usaremos. Por ejemplo en el video hago la prueba para que me indique los ciudadanos que viven en cierta ciudad.


  2. Rango (Tomando varias celdas como Contexto)=GPTFormula(“Prompt”;Rango)
    En la Fórmula tenemos básicamente lo mismo que para texto simple pero en Rango le especificamos el rango de datos, por ejemplo si en la fila 1, desde la columna a hasta la G tengo los datos se indicaría así: =GPTFormula(“Crea un Resúmen de los siguientes datos:”;A1:G1)


  3. Imagen (Tomando el prompt que le pongas, las dimensiones y la calidad)=DALLEFormula(A15; “1024×1024”; “standard”)
    Si deseas crear imágenes masivamente también es buena opción, el primer parámetro es donde está el prompt, el segundo el tamaño (también puedes indicarlo en una celda), y el tercero la calidad (también puedes indicarlo en una celda)


 

DESCARGAR GPT4Sheets Gratis

Bien!!! Ahora que sabes lo que es GPT for Sheets, y que ya sabes como se utiliza solo tienes que copiar y pegar tus códigos, AQUÍ LOS TIENES!!!!

<!DOCTYPE html>
<html>
<head>
  <base target="_top">
  <style>
    body {
      font-family: Arial, sans-serif;
      padding: 20px;
    }
    select, input {
      width: 100%;
      padding: 8px;
      margin-bottom: 10px;
      border: 1px solid #ccc;
      border-radius: 4px;
    }
    button {
      padding: 10px 20px;
      background-color: #4CAF50;
      color: white;
      border: none;
      border-radius: 4px;
      cursor: pointer;
    }
    button:hover {
      background-color: #45a049;
    }
  </style>
</head>
<body>
  <h2>Configurar Parámetros del Modelo GPT</h2>
  <label for="model">Modelo:</label>
 <select id="model" name="model">
  <option value="gpt-3.5-turbo">GPT-3.5 Turbo</option>
  <option value="gpt-3.5-turbo-16k">GPT-3.5 Turbo 16k</option>
  <option value="gpt-4">GPT-4</option>
  <option value="gpt-4-32k">GPT-4 32k</option>
  <option value="gpt-4-1106-preview">GPT-4 Turbo</option>
  <option value="gpt-4-0125-preview">GPT-4 Turbo Preview</option>
  <option value="gpt-4o-2024-05-13">GPT-4O 2024-05-13</option> <!-- Nueva opción -->
</select>
  <label for="temperature">Temperatura:</label>
  <input type="number" step="0.1" id="temperature" name="temperature" placeholder="0.0">
  <label for="maxTokens">Máximo de Tokens:</label>
  <input type="number" id="maxTokens" name="maxTokens" placeholder="200">
  <button onclick="saveParameters()">Guardar</button>
  <script>
    function saveParameters() {
      const model = document.getElementById('model').value;
      const temperature = document.getElementById('temperature').value;
      const maxTokens = document.getElementById('maxTokens').value;
      google.script.run.saveParameters(model, temperature, maxTokens);
      google.script.host.close();
    }
  </script>
</body>
</html>

// Función para agregar menú personalizado en Google Sheets
function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('GPT-3/4 & DALL-E')
    .addItem('Configurar API Key', 'setAPIKey')
    .addItem('Configurar Parámetros', 'setParameters')
    .addItem('Crear Imagen con DALL-E', 'createDALLEImageUI')
    .addToUi();
}

// Función para configurar la API Key
function setAPIKey() {
  var ui = SpreadsheetApp.getUi();
  var response = ui.prompt('Configurar API Key', 'Por favor, introduce tu API Key:', ui.ButtonSet.OK_CANCEL);
  
  if (response.getSelectedButton() == ui.Button.OK) {
    var apiKey = response.getResponseText().trim();
    if (apiKey) {
      PropertiesService.getUserProperties().setProperty('GPT_API_KEY', apiKey);
      ui.alert('API Key configurada correctamente.');
      Logger.log('API Key configurada: ' + apiKey);
    } else {
      ui.alert('Error: La API Key no puede estar vacía.');
    }
  } else {
    ui.alert('Operación cancelada.');
  }
}

// Función para configurar los parámetros del modelo GPT
function setParameters() {
  var htmlOutput = HtmlService.createHtmlOutputFromFile('ParametersDialog')
      .setWidth(400)
      .setHeight(350);
  SpreadsheetApp.getUi().showModalDialog(htmlOutput, 'Configurar Parámetros');
}

// Función para guardar los parámetros del modelo GPT desde el diálogo HTML
function saveParameters(model, temperature, maxTokens) {
  PropertiesService.getUserProperties().setProperties({
    'GPT_MODEL': model || 'gpt-3.5-turbo',
    'GPT_TEMPERATURE': temperature || '0.0',
    'GPT_MAX_TOKENS': maxTokens || '200'
  });
  SpreadsheetApp.getUi().alert('Parámetros configurados correctamente.');
}

// Función base para llamadas a la API de OpenAI GPT
function OpenAIGPT(text, prompt, systemPrompt, maxTokens, temperature, model) {
  var properties = PropertiesService.getUserProperties();
  var apiKey = properties.getProperty('GPT_API_KEY');
  
  if (!apiKey) {
    return 'Error: API key no configurada. Por favor, configúrela en el menú GPT-3/4 > Configurar API Key.';
  }

  model = properties.getProperty('GPT_MODEL') || model || 'gpt-3.5-turbo';
  temperature = parseFloat(properties.getProperty('GPT_TEMPERATURE')) || temperature || 0.0;
  maxTokens = parseInt(properties.getProperty('GPT_MAX_TOKENS')) || maxTokens || 200;
  systemPrompt = systemPrompt || "You are a helpful assistant.";

  var data = {
    "model": model,
    "messages": [
      {"role": "system", "content": systemPrompt},
      {"role": "user", "content": text + "\n" + prompt}
    ],
    "temperature": temperature,
    "max_tokens": maxTokens,
    "n": 1,
    "top_p": 1.0,
    "frequency_penalty": 0.0,
    "presence_penalty": 0.0,
  };

  var options = {
    'method': 'post',
    'contentType': 'application/json',
    'payload': JSON.stringify(data),
    'headers': {
      Authorization: 'Bearer ' + apiKey,
    },
  };

  try {
    var response = UrlFetchApp.fetch('https://api.openai.com/v1/chat/completions', options);
    var result = JSON.parse(response.getContentText());

    if (response.getResponseCode() === 200) {
      var content = result.choices[0].message.content.trim();
      return moderateOutput(content, apiKey);
    } else {
      Logger.log(result);
      return 'Error: ' + (result.error ? result.error.message : 'Unknown error');
    }
  } catch (e) {
    Logger.log(e);
    return 'Error: ' + e.message;
  }
}

// Función para moderar la salida del modelo
function moderateOutput(content, apiKey) {
  var optionsModeration = {
    'payload': JSON.stringify({"input": content}),
    'method': 'post',
    'contentType': 'application/json',
    'headers': {
      Authorization: 'Bearer ' + apiKey,
    },
  };

  try {
    var responseModeration = UrlFetchApp.fetch('https://api.openai.com/v1/moderations', optionsModeration);
    var resultFlagged = JSON.parse(responseModeration.getContentText()).results[0].flagged;

    if (resultFlagged) {
      return "The OpenAI moderation API blocked the response.";
    } else {
      return parseOutput(content);
    }
  } catch (e) {
    Logger.log(e);
    return 'Error: ' + e.message;
  }
}

// Función para analizar y formatear la salida del modelo
function parseOutput(result) {
  try {
    if (result.includes('{') && result.includes('}')) {
      var cleanedJsonString = '{' + result.split("{")[1].trim().split("}")[0].trim() + '}';
      var resultJson = JSON.parse(cleanedJsonString);
      return [Object.values(resultJson)];
    } else if (result.split("|").length - 1 >= 6) {
      var arrayNested = result.split('\n').map(function(row) {
        return row.split('|').map(function(cell) { return cell.trim(); });
      });
      arrayNested = arrayNested.map(function(array) { return array.slice(1, -1); });
      arrayNested = arrayNested.filter(function(subArr) { return subArr.length > 0; });
      arrayNested = arrayNested.filter(function(subArr) { 
        return !(subArr[0].includes("---") && subArr[1].includes("---")); 
      });
      return arrayNested;
    } else {
      return result;
    }
  } catch (e) {
    Logger.log("Error parsing output: " + e);
    return result;
  }
}

// Función para estimar el costo de una solicitud a GPT
function GPTCOST(model, maxOutputTokens, text, prompt, systemPrompt) {
  model = model || 'gpt-3.5-turbo';
  maxOutputTokens = maxOutputTokens || 100;
  text = text || '';
  prompt = prompt || '';
  systemPrompt = systemPrompt || '';

  var inputAll = text + " " + prompt + " " + systemPrompt;
  var inputCharacters = inputAll.length;
  var nInputTokens = Math.round(inputCharacters / 4) + 6;
  var costForRequest = 0;

  var modelPricing = {
    'gpt-3.5-turbo': { input: 0.002, output: 0.002 },
    'gpt-3.5-turbo-16k': { input: 0.003, output: 0.004 },
    'gpt-4': { input: 0.03, output: 0.06 },
    'gpt-4-32k': { input: 0.06, output: 0.12 },
    'gpt-4-1106-preview': { input: 0.01, output: 0.03 },
    'gpt-4-0125-preview': { input: 0.01, output: 0.03 },
  };

  if (model.toLowerCase() in modelPricing) {
    var pricing = modelPricing[model.toLowerCase()];
    costForRequest = (pricing.input * nInputTokens + pricing.output * maxOutputTokens) / 1000;
  } else {
    return "Model name " + model + " is not supported. Choose one from: " + Object.keys(modelPricing).join(', ');
  }

  return +costForRequest.toFixed(4);
}

// Función para invocar específicamente a ChatGPT usando la función base OpenAIGPT
function CHATGPT(text, prompt, systemPrompt, maxTokens, temperature, model) {
  return OpenAIGPT(text, prompt, systemPrompt, maxTokens, temperature, model);
}

// Función para invocar específicamente a GPT-4 usando la función base OpenAIGPT
function GPT4(text, prompt, systemPrompt, maxTokens, temperature, model) {
  return OpenAIGPT(text, prompt, systemPrompt, maxTokens, temperature, 'gpt-4');
}

// Función para usar como fórmula en Google Sheets
function GPTFormula(prompt, value) {
  try {
    var input = prompt + value;
    return OpenAIGPT(input, "");
  } catch (e) {
    Logger.log(e);
    return 'Error: ' + e.message;
  }
}

// Función para crear una imagen con DALL-E 3
function createDALLEImage(prompt, size, n, quality) {
  var properties = PropertiesService.getUserProperties();
  var apiKey = properties.getProperty('GPT_API_KEY');
  
  if (!apiKey) {
    return 'Error: API key no configurada. Por favor, configúrela en el menú GPT-3/4 > Configurar API Key.';
  }

  size = size || '1024x1024';
  n = n || 1;
  quality = quality || "standard";

  var data = {
    "model": "dall-e-3",
    "prompt": prompt,
    "n": n,
    "size": size,
    "quality": quality
  };

  var options = {
    'method': 'post',
    'contentType': 'application/json',
    'payload': JSON.stringify(data),
    'headers': {
      Authorization: 'Bearer ' + apiKey,
    },
  };

  try {
    var response = UrlFetchApp.fetch('https://api.openai.com/v1/images/generations', options);
    var result = JSON.parse(response.getContentText());

    if (response.getResponseCode() === 200) {
      // Devuelve la URL de la imagen generada
      return result.data[0].url;
    } else {
      Logger.log(result);
      return 'Error: ' + (result.error ? result.error.message : 'Unknown error');
    }
  } catch (e) {
    Logger.log(e);
    return 'Error: ' + e.message;
  }
}

// Función para usar como fórmula en Google Sheets para DALL-E 3
function DALLEFormula(prompt, size, quality) {
  size = size || "1024x1024";
  quality = quality || "standard";
  return createDALLEImage(prompt, size, 1, quality);
}

// Función para crear una interfaz de usuario para DALL-E
function createDALLEImageUI() {
  var ui = SpreadsheetApp.getUi();
  var response = ui.prompt('Crear Imagen con DALL-E', 'Ingrese el prompt para la imagen:', ui.ButtonSet.OK_CANCEL);
  
  if (response.getSelectedButton() == ui.Button.OK) {
    var prompt = response.getResponseText().trim();
    if (prompt) {
      var imageUrl = createDALLEImage(prompt);
      if (imageUrl.startsWith('http')) {
        var sheet = SpreadsheetApp.getActiveSheet();
        var cell = sheet.getActiveCell();
        cell.setValue(imageUrl);
        ui.alert('Imagen creada con éxito. La URL ha sido insertada en la celda activa.');
      } else {
        ui.alert('Error: ' + imageUrl);
      }
    } else {
      ui.alert('Error: El prompt no puede estar vacío.');
    }
  } else {
    ui.alert('Operación cancelada.');
  }
}

Scroll al inicio