[SHARE] Partage Apps Script Google Sheets

Hello la commu’ :v:,

Je pense que ce post mérite son propre sujet.

Y’a peut-être d’autres méthodes plus simple, mais dans le doute car je n’ai pas vu, je pense que ça pourrait en intéresser certain :

Je suis en train de faire un Apps Script qui appelle directement GPT 4o (en script ou formule) pour appliquer des traitements.

(Je pense notamment aussi au cas de @Tpercher dans ce sujet)

Voici un exemple de traitement effectué (composé via différents scripts + Open AI) :

Et y a aussi la possibilité de faire une formule directement pour se référer à des cellules et obtenir une réponse dans une cellule.

Voici le script pour faire cela (à appeler en formule ou utiliser dans un script plus complexe)

La formule :
=OpenAI("Regarde la cellule " & D64 & " et dis-moi si c'est un post de C-level ou pas")

Le script :

/************************************************************************
 * 1) Clé API et fonction OpenAI
 * Remplace la valeur de OPENAI_API_KEY par ta propre clé.
 ************************************************************************/
const OPENAI_API_KEY = 'VOTRE CLE OPEN AI ICI';

/**
 * Fonction interne qui contacte l'API OpenAI en utilisant le modèle "gpt-4o".
 * Cette fonction n'est pas destinée à être appelée directement dans les cellules Sheets,
 * mais plutôt via la fonction publique OpenAI(prompt).
 *
 * @param {string} prompt - Le prompt (texte complet) envoyé au modèle gpt-4o-mini.
 * @return {string} - Le texte de réponse généré par le modèle, ou un message d'erreur.
 */
function callOpenAI_(prompt) {
  // URL officielle pour les Chat Completions avec le modèle "gpt-4o"
  const apiUrl = 'https://api.openai.com/v1/chat/completions';

  // Configuration des en-têtes pour l’appel à l’API
  const headers = {
    'Authorization': 'Bearer ' + OPENAI_API_KEY,
    'Content-Type': 'application/json'
  };

  // Construction du payload avec le modèle "gpt-4o" et une température définie
  const payload = {
    'model': 'gpt-4o',
    'messages': [
      {
        'role': 'user',
        'content': prompt
      }
    ],
    'temperature': 0.7
  };

  // Options pour UrlFetchApp.fetch
  const options = {
    'method': 'post',
    'headers': headers,
    'payload': JSON.stringify(payload),
    'muteHttpExceptions': true
  };

  try {
    // Envoi de la requête à l'API OpenAI
    const response = UrlFetchApp.fetch(apiUrl, options);
    const json = JSON.parse(response.getContentText());

    // Gestion d'erreur retournée par l'API
    if (json.error) {
      return "Erreur API : " + (json.error.message || JSON.stringify(json.error));
    }

    // Extraction et retour du contenu généré par le modèle
    return json.choices[0].message.content.trim();
  } catch (e) {
    // Gestion d'une erreur lors de l'appel à l'API
    return "Erreur lors de l'appel de l'API OpenAI : " + e.toString();
  }
}

/************************************************************************
 * 2) Fonction publique OpenAI
 *    Cette fonction est destinée à être appelée directement depuis
 *    une cellule dans Google Sheets.
 *
 * Exemple d'utilisation dans Sheets :
 *   =OpenAI("Ton prompt ici")
 ************************************************************************/
function OpenAI(prompt) {
  if (!prompt || prompt.trim().length === 0) {
    return "Erreur : prompt vide.";
  }
  return callOpenAI_(prompt);
}

Certainement possible de l’améliorer pour faire des plus gros batchs pour ne pas trop repayer des token pour le prompt d’instruction, le cache, etc.
Possible aussi de faire appel à gpt-4o-mini.

N’hésitez pas à partager une amélioration si vous en faîtes une ou d’autres Apps Script intéressants :wink:

PS : Attention à bien copier et coller vos valeurs en brut et ne pas laisser le formules telle quelle, sinon vous allez refaire des calls API payant à chaque ouverture du Sheets. Peut-être qu’ajouter un système de cache serait l’idéal.

6 « J'aime »

Hello @Kevin-Zimmermann trop bien ton post ! C’est un peu ce que je recherchais mais sur des use-cases plus simples. En gros j’ai investi quelques crédits dans OpenAI que je plugge à mon csv et quand je scrappe une liste sur Linkedin il arrive parfois que j’ai des « Url Linkedin non cliquables » dans une colonne car je me suis rendu compte qu’ils avaient un accent dans leur prénom. Du coup je crée une colonne supplémentaire à droite de mon csv et j’avais essayé de donner un prompt du style « passe de la colonne A à la colonne B en rendant le lien Url linkedin cliquable » et une fois j’y suis arrivé mais depuis non et après je faisais passer le fichier dans Chatgpt en lui demandant de nettoyer et je le réexprtai derrière mais c’était hyper long…
Du coup je sais pas si j’ai été clair ^^

Si j’ai bien compris ce que tu veux @Stanley_1 :

T’as juste à mettre la formule =hyperlink(A2)

A2 étant là où tu as ton URL non cliquable.

C’est ce que je fais dans Google Sheets en tout cas :wink:

1 « J'aime »

Perso j’utilise cette extension :

2 « J'aime »

Du très lourd @Kevin-Zimmermann ! Je l’utilise aussi tous les jours depuis quelques semaines. Les Apps Script, c’est une dinguerie, surtout combinés avec OpenAI. J’ai aussi testé avec DeepSeek, mais j’ai été très déçu du résultat.
Le meilleur modèle reste GPT-4o-mini !

3 « J'aime »

Yes merci de ton retour je connaissais cette technique elle marchait bien et d’un coup j’ai fait le test sur plusieurs csv et le mot « hyperlink » n’était plus proposé dans la deuxième colonne que j’ai crée après le = …du coup j’ai essayé de refaire le test avant de t’écrire ce message mais ça refonctionnait ^^c’est toujours comme ça quand tu veux montrer une faille (je te montrerai en temps réel si ça se reproduit)… merci à toi
On est d’accord tu crée juste une colonne à côté avec =hyperlink dans la cellule en renvoyant vers la cellule qui n’a pas de lien cliquable ?
Et tu sais comment supprimer la colonne originale sans que ça n’ait d’impact sur la nouvelle colonne ? après avoir tiré toute la formule sur toute la colonne je veux supprimer la colonne originale mais ça me met « ERREUR » dans la nouvelle colonne…

merci à toi je viens de la télécharger mais tu peux me dire en 2 phrases les use cases que ça permet de traiter aussi ? est est ce que ça permet de traiter le cas que je viens de mentionner ?
Merci ^^

Ce que tu demandes peut être réalisé surtout avec un script app script et une formule hyperlink. Je l’ai créé aujourd’hui.

J’ai une cellule avec la construction suivante :

=LIEN_HYPERTEXTE(« Google Search » & A1 & « + » & B1 & « + » & C1; « ICI »)

Puis j’ai le scrip suivant avec une API Google search et la simulation d’un moteur de recherche LinkedIn.

Si tu ne comprends pas tout, prends un copier collé et mets le tout dans Chatgpt 4o mini pour le codage. Il t’expliquera tout.

const API_KEY = 'TON API ICI ';
const CX_ID = 'TON ID MOTEUR DE RECHERCHE ';

/**

  • Cherche le premier lien LinkedIn via l’API Google Custom Search
    */
    function findLinkedInProfile(name, company) {
    const query = ‹ site:linkedin.com/in " › + name + ‹ " " › + company + ‹ " ›;
    const url = ‹ https://www.googleapis.com/customsearch/v1?key= › + API_KEY +
    ‹ &cx= › + CX_ID +
    ‹ &q= › + encodeURIComponent(query);

try {
const response = UrlFetchApp.fetch(url);
const json = JSON.parse(response.getContentText());

if (json.items && json.items.length > 0) {
  return json.items[0].link;
} else {
  return 'Profil non trouvé';
}

} catch (e) {
return 'Erreur : ’ + e.message;
}
}

/**

  • Remplit automatiquement les résultats LinkedIn dans la colonne AE
    */
    function fetchProfilesFromSheet() {
    const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
    const dataRange = sheet.getDataRange();
    const values = dataRange.getValues();

for (let i = 1; i < values.length; i++) {
const prenom = values[i][2]; // Colonne C
const nom = values[i][3]; // Colonne D
const entreprise = values[i][5]; // Colonne F
const dejaRempli = values[i][30]; // Colonne AE (index 30 car index 0 = colonne A)

// Si déjà rempli → on saute cette ligne
if (dejaRempli && dejaRempli.toString().trim() !== '') continue;

if (prenom && nom && entreprise) {
  const result = findLinkedInProfile(prenom + ' ' + nom, entreprise);
  sheet.getRange(i + 1, 31).setValue(result); // Colonne AE = 31
  Utilities.sleep(1000);
}

}
}

2 « J'aime »

Waw merci bcp Mikaelbert effectivement j’ai pas tout compris mais je vais déjà réessayer avec le Hyperlink ou Hypertexte merci :wink:

Perso j’utilise Gemini, c gratuit en plus.

1 « J'aime »

Yes @Api2 ça a le mérite d’être souligné, je ne sais pas si ça fait longtemps, mais j’ai bien l’impression que c’est sorti au moment où j’ai créé ce sujet :

https://medium.com/@avinash2060/google-sheets-now-has-an-ai-formula-powered-by-gemini-54fa124c87aa