/start-10-4.es
Lesson command
$ npx -y skills add minicoohei/ai-agent-camp --agent claude-codeHow it fires
How this command gets triggered: by you, by Claude, or both.
- Fires itselfClaude auto-loads it when your prompt matches the work.
- You can call itInvoke it directly when you want it.
- Slash command
/start-10-4.es
Context preview
What this command does when you run it.
Lesson command
Command definition
start-10-4.es.mddescription: "Lesson command"
chapter: "courses/aiagent/lesson03-core/module10-gas"
duration: "~25 min"
prerequisites: ["start-10-1"]
level: "intermediate"
tags: ["gas", "gmail", "sheets", "automation", "clasp"]
nonInteractiveMode: deferred
๐ Lesson 10-4: Busqueda y extraccion de correos con GmailApp โ Organizacion en hoja de calculo
๐ Lo que hara en esta sesion
**Lesson 10-4: Busqueda y extraccion de correos con GmailApp โ Organizacion en hoja de calculo**!
| Elemento | Contenido | |------|------| | Objetivo | Buscar y extraer correos con GmailApp de GAS y organizarlos automaticamente en una hoja de calculo | | Duracion | ~25 min | | Habilidades utilizadas | GAS (GmailApp, SpreadsheetApp), clasp | | Requisitos previos | Lesson 10-1 completada (clasp autenticado) |
**Flujo de la sesion:** 1. Agregar scope de Gmail a appsscript.json 2. Buscar correos con GmailApp.search() 3. Extraer informacion de hilos/mensajes 4. Escribir datos en hoja de calculo con SpreadsheetApp 5. Configurar trigger de ejecucion periodica
Al final de esta sesion, tendra un script de GAS completo que busca y extrae correos automaticamente y los organiza en una hoja de calculo.
> **๐ก Consejo**: Si la respuesta de la IA se detiene a mitad de camino, escriba "por favor continue" o "siga adelante" para reanudar.
---
๐ฏ Verificacion de preparacion
Primero verifiquemos que todo este listo.
**Configuracion de AskQuestion:**
{
"title": "๐ฏ Verificacion previa a la sesion",
"questions": [{
"id": "readiness",
"prompt": "Esta listo/a?",
"options": [
{"id": "ready", "label": "Listo! Comencemos"},
{"id": "check_prereq", "label": "Verificar requisitos previos"},
{"id": "different_lesson", "label": "Ir a otra leccion"}
]
}]
}(ready โ Ir al Step 1) (check_prereq โ Verificar que Lesson 10-1 este completada. Verificar estado de autenticacion con `clasp login --status`) (different_lesson โ Mostrar lista de modulos)
---
๐ Step 1: Agregar scope de Gmail a appsscript.json
{
"title": "๐ Step 1: Agregar scope de Gmail",
"questions": [{
"id": "step_action",
"prompt": "Se agregara el scope de lectura de Gmail a appsscript.json.",
"options": [
{"id": "practice", "label": "Continuar"},
{"id": "review", "label": "Ver el appsscript.json actual"},
{"id": "skip", "label": "Omitir"}
]
}]
}**Indicaciones tras la seleccion:**
Agregar lo siguiente a `oauthScopes` en `gas-example/appsscript.json`:
{
"timeZone": "Asia/Tokyo",
"dependencies": {},
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8",
"oauthScopes": [
"https://www.googleapis.com/auth/gmail.readonly",
"https://www.googleapis.com/auth/spreadsheets",
"https://www.googleapis.com/auth/script.scriptapp"
]
}Despues de agregar, desplegar con `clasp push`:
cd gas-example && npx -y @google/clasp push
**Resultado esperado**: El scope `gmail.readonly` se agrega a `appsscript.json` y el push se realiza correctamente.
---
๐ Step 2: Buscar correos con GmailApp.search()
{
"title": "๐ Step 2: Busqueda de correos",
"questions": [{
"id": "step_action",
"prompt": "Se creara una funcion para buscar correos usando GmailApp.search().",
"options": [
{"id": "practice", "label": "Continuar"},
{"id": "review", "label": "Ver sintaxis de consultas de busqueda de Gmail"},
{"id": "skip", "label": "Omitir"}
]
}]
}**Indicaciones tras la seleccion:**
Crear la funcion `searchEmails` en `gas-example/Gmail.gs`:
function searchEmails(query, maxResults) {
query = query || "is:unread newer_than:7d";
maxResults = maxResults || 50;
var threads = GmailApp.search(query, 0, maxResults);
Logger.log("Resultados de busqueda: " + threads.length + " hilos");
return threads;
}**Ejemplos de consultas de busqueda de Gmail:**
| Consulta | Significado | |--------|------| | `is:unread` | Correos no leidos | | `newer_than:7d` | Ultimos 7 dias | | `from:example@company.com` | Remitente especifico | | `subject:reunion` | Asunto que contiene "reunion" | | `has:attachment` | Con archivo adjunto | | `is:unread newer_than:3d` | Condicion compuesta |
`clasp push` โ `clasp open` para abrir el editor de GAS, ejecutar `searchEmails` y verificar los logs.
**Resultado esperado**: Se muestra en los logs el numero de hilos encontrados.
---
๐ Step 3: Extraccion de informacion de correos
{
"title": "๐ Step 3: Extraccion de informacion de correos",
"questions": [{
"id": "step_action",
"prompt": "Se extraera informacion de los hilos (remitente, asunto, fecha, cuerpo).",
"options": [
{"id": "practice", "label": "Continuar"},
{"id": "review", "label": "Ver la API de GmailMessage"},
{"id": "skip", "label": "Omitir"}
]
}]
}**Indicaciones tras la seleccion:**
Agregar la funcion `extractEmailData`:
function extractEmailData(threads) {
var data = [];
threads.forEach(function(thread) {
var messages = thread.getMessages();
var lastMessage = messages[messages.length - 1];
data.push({
subject: lastMessage.getSubject(),
from: lastMessage.getFrom(),
date: lastMessage.getDate(),
body: lastMessage.getPlainBody().substring(0, 200),
isUnread: lastMessage.isUnread(),
messageCount: messages.length
});
});
return data;
}**Metodos principales:**
| Metodo | Contenido obtenido | |---------|---------| | `getSubject()` | Asunto | | `getFrom()` | Remitente | | `getDate()` | Fecha y hora | | `getPlainBody()` | Cuerpo (texto) | | `isUnread()` | Si esta no leido | | `getMessages().length` | Numero de mensajes en el hilo |
**Resultado esperado**: La informacion de correos se extrae como un array de objetos.
---
๐ Step 4: Escribir datos en hoja de calculo
{
"title": "๐ Step 4: Escribir en la hoja",
"questions": [{
"id": "step_actionRead more
description: "Lesson command" chapter: "courses/aiagent/lesson03-core/module10-gas" duration: "~25 min" prerequisites: ["start-10-1"] level: "intermediate" tags: ["gas", "gmail", "sheets", "automation", "clasp"] nonInteractiveMode: deferred
๐ Lesson 10-4: Busqueda y extraccion de correos con GmailApp โ Organizacion en hoja de calculo
๐ Lo que hara en esta sesion
**Lesson 10-4: Busqueda y extraccion de correos con GmailApp โ Organizacion en hoja de calculo**!
| Elemento | Contenido | |------|------| | Objetivo | Buscar y extraer correos con GmailApp de GAS y organizarlos automaticamente en una hoja de calculo | | Duracion | ~25 min | | Habilidades utilizadas | GAS (GmailApp, SpreadsheetApp), clasp | | Requisitos previos | Lesson 10-1 completada (clasp autenticado) |
**Flujo de la sesion:** 1. Agregar scope de Gmail a appsscript.json 2. Buscar correos con GmailApp.search() 3. Extraer informacion de hilos/mensajes 4. Escribir datos en hoja de calculo con SpreadsheetApp 5. Configurar trigger de ejecucion periodica
Al final de esta sesion, tendra un script de GAS completo que busca y extrae correos automaticamente y los organiza en una hoja de calculo.
> **๐ก Consejo**: Si la respuesta de la IA se detiene a mitad de camino, escriba "por favor continue" o "siga adelante" para reanudar.
---
๐ฏ Verificacion de preparacion
Primero verifiquemos que todo este listo.
**Configuracion de AskQuestion:**
{
"title": "๐ฏ Verificacion previa a la sesion",
"questions": [{
"id": "readiness",
"prompt": "Esta listo/a?",
"options": [
{"id": "ready", "label": "Listo! Comencemos"},
{"id": "check_prereq", "label": "Verificar requisitos previos"},
{"id": "different_lesson", "label": "Ir a otra leccion"}
]
}]
}(ready โ Ir al Step 1) (check_prereq โ Verificar que Lesson 10-1 este completada. Verificar estado de autenticacion con `clasp login --status`) (different_lesson โ Mostrar lista de modulos)
---
๐ Step 1: Agregar scope de Gmail a appsscript.json
{
"title": "๐ Step 1: Agregar scope de Gmail",
"questions": [{
"id": "step_action",
"prompt": "Se agregara el scope de lectura de Gmail a appsscript.json.",
"options": [
{"id": "practice", "label": "Continuar"},
{"id": "review", "label": "Ver el appsscript.json actual"},
{"id": "skip", "label": "Omitir"}
]
}]
}**Indicaciones tras la seleccion:**
Agregar lo siguiente a `oauthScopes` en `gas-example/appsscript.json`:
{
"timeZone": "Asia/Tokyo",
"dependencies": {},
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8",
"oauthScopes": [
"https://www.googleapis.com/auth/gmail.readonly",
"https://www.googleapis.com/auth/spreadsheets",
"https://www.googleapis.com/auth/script.scriptapp"
]
}Despues de agregar, desplegar con `clasp push`:
cd gas-example && npx -y @google/clasp push
**Resultado esperado**: El scope `gmail.readonly` se agrega a `appsscript.json` y el push se realiza correctamente.
---
๐ Step 2: Buscar correos con GmailApp.search()
{
"title": "๐ Step 2: Busqueda de correos",
"questions": [{
"id": "step_action",
"prompt": "Se creara una funcion para buscar correos usando GmailApp.search().",
"options": [
{"id": "practice", "label": "Continuar"},
{"id": "review", "label": "Ver sintaxis de consultas de busqueda de Gmail"},
{"id": "skip", "label": "Omitir"}
]
}]
}**Indicaciones tras la seleccion:**
Crear la funcion `searchEmails` en `gas-example/Gmail.gs`:
function searchEmails(query, maxResults) {
query = query || "is:unread newer_than:7d";
maxResults = maxResults || 50;
var threads = GmailApp.search(query, 0, maxResults);
Logger.log("Resultados de busqueda: " + threads.length + " hilos");
return threads;
}**Ejemplos de consultas de busqueda de Gmail:**
| Consulta | Significado | |--------|------| | `is:unread` | Correos no leidos | | `newer_than:7d` | Ultimos 7 dias | | `from:example@company.com` | Remitente especifico | | `subject:reunion` | Asunto que contiene "reunion" | | `has:attachment` | Con archivo adjunto | | `is:unread newer_than:3d` | Condicion compuesta |
`clasp push` โ `clasp open` para abrir el editor de GAS, ejecutar `searchEmails` y verificar los logs.
**Resultado esperado**: Se muestra en los logs el numero de hilos encontrados.
---
๐ Step 3: Extraccion de informacion de correos
{
"title": "๐ Step 3: Extraccion de informacion de correos",
"questions": [{
"id": "step_action",
"prompt": "Se extraera informacion de los hilos (remitente, asunto, fecha, cuerpo).",
"options": [
{"id": "practice", "label": "Continuar"},
{"id": "review", "label": "Ver la API de GmailMessage"},
{"id": "skip", "label": "Omitir"}
]
}]
}**Indicaciones tras la seleccion:**
Agregar la funcion `extractEmailData`:
function extractEmailData(threads) {
var data = [];
threads.forEach(function(thread) {
var messages = thread.getMessages();
var lastMessage = messages[messages.length - 1];
data.push({
subject: lastMessage.getSubject(),
from: lastMessage.getFrom(),
date: lastMessage.getDate(),
body: lastMessage.getPlainBody().substring(0, 200),
isUnread: lastMessage.isUnread(),
messageCount: messages.length
});
});
return data;
}**Metodos principales:**
| Metodo | Contenido obtenido | |---------|---------| | `getSubject()` | Asunto | | `getFrom()` | Remitente | | `getDate()` | Fecha y hora | | `getPlainBody()` | Cuerpo (texto) | | `isUnread()` | Si esta no leido | | `getMessages().length` | Numero de mensajes en el hilo |
**Resultado esperado**: La informacion de correos se extrae como un array de objetos.
---
๐ Step 4: Escribir datos en hoja de calculo
{
"title": "๐ Step 4: Escribir en la hoja",
"questions": [{
"id": "step_actionAI Agent Training for Non-Engineers - Complete Guide to Claude Code / Cursor / Codex ### โ ๏ธ Before you clone Official repository (maintained by the authors): Running AI agents from this repo grants them shell, file-write, and external-API permissions on your
Other commands on ai-agent-camp.
- /check-setup.en
Top-level alias โ see lesson/check-setup.en.md for the full body.
Open command - /check-setup.es
Alias de nivel superior โ el cuerpo completo estรก en lesson/check-setup.es.md.
Open command - /check-setup
Top-level alias โ see lesson/check-setup.md for the full body.
Open command - /check-security.en
Lesson command
Open command - /check-security.es
Lesson command
Open command - /check-security
Lesson command
Open command

