# Guide d'activation de la synchronisation Google Sheets 🔄

Ce guide vous explique comment connecter votre Google Sheet et votre application locale **Paraffine Prospect Tracker** pour que toute modification (ajout, mise à jour, changement de statut, notes) soit répercutée en temps réel dans les deux sens, sans aucun logiciel intermédiaire payant.

---

## Étape 1 : Ajouter le script dans votre Google Sheet

1. Ouvrez votre Google Sheet [prospection_paraffine](https://docs.google.com/spreadsheets/d/1QXiwBcwH5SUdl8_vHBnsVmZENZVRK5V1vRhlI1lP9Eo/edit) dans votre navigateur.
2. Dans le menu du haut, cliquez sur **Extensions** > **Apps Script**.
3. Supprimez le code existant dans l'éditeur (s'il y en a) et collez le code JavaScript ci-dessous :

```javascript
// Dictionnaire de correspondance entre les colonnes du Sheet et les clés du Tracker
const COLUMN_MAP = {
  "Nom": "name",
  "Structure": "company",
  "Segment": "segment",
  "Rôle": "role",
  "Priorité": "priority",
  "Canal": "channel",
  "Email": "email",
  "À contacter": "status",
  "Date contact": "contact_date",
  "Notes": "notes",
  "Date RDV": "rdv_date",
  "Heure RDV": "rdv_time"
};

// 1. LIRE LES CONTACTS (Appelé au chargement de l'appli)
function doGet() {
  try {
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
    var data = sheet.getDataRange().getValues();
    if (data.length <= 1) {
      return createJsonResponse([]);
    }
    
    var headers = data[0];
    var contacts = [];
    
    for (var i = 1; i < data.length; i++) {
      var row = data[i];
      var contact = { id: i, history: [], templates: [] };
      
      for (var j = 0; j < headers.length; j++) {
        var header = headers[j];
        var key = COLUMN_MAP[header];
        if (key) {
          contact[key] = row[j];
        }
      }
      
      // Nettoyage des formats de valeurs
      if (contact.priority) {
        contact.priority = parseInt(contact.priority) || 2;
      } else {
        contact.priority = 2;
      }
      
      // Conversion des dates JS en chaînes YYYY-MM-DD
      if (contact.contact_date instanceof Date) {
        contact.contact_date = Utilities.formatDate(contact.contact_date, SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone(), "yyyy-MM-dd");
      }
      if (contact.rdv_date instanceof Date) {
        contact.rdv_date = Utilities.formatDate(contact.rdv_date, SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone(), "yyyy-MM-dd");
      }
      
      // Formatage de l'heure du rendez-vous
      if (contact.rdv_time instanceof Date) {
        var hours = contact.rdv_time.getHours().toString().padStart(2, '0');
        var minutes = contact.rdv_time.getMinutes().toString().padStart(2, '0');
        contact.rdv_time = hours + ":" + minutes;
      } else if (contact.rdv_time) {
        // Si c'est déjà une chaîne, s'assurer du bon format HH:MM
        contact.rdv_time = contact.rdv_time.toString().trim();
      }
      
      contacts.push(contact);
    }
    
    return createJsonResponse(contacts);
  } catch (error) {
    return createJsonResponse({ error: error.toString() });
  }
}

// 2. ENREGISTRER / MODIFIER UN CONTACT (Appelé lors d'une sauvegarde dans l'appli)
function doPost(e) {
  try {
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
    var payload = JSON.parse(e.postData.contents);
    var contact = payload.contact;
    
    var data = sheet.getDataRange().getValues();
    var headers = data[0];
    
    // Trouver la colonne "Nom"
    var nameColIdx = headers.indexOf("Nom");
    if (nameColIdx === -1) {
      return createJsonResponse({ error: "Colonne 'Nom' introuvable dans le Google Sheet." });
    }
    
    // Rechercher si le contact existe déjà
    var rowNum = -1;
    for (var i = 1; i < data.length; i++) {
      if (data[i][nameColIdx].toString().trim().toLowerCase() === contact.name.toString().trim().toLowerCase()) {
        rowNum = i + 1; // 1-indexed for sheets, +1 for header
        break;
      }
    }
    
    if (rowNum !== -1) {
      // MISE À JOUR d'un contact existant
      updateSheetRow(sheet, headers, rowNum, contact);
    } else {
      // CRÉATION d'un nouveau contact
      appendSheetRow(sheet, headers, contact);
    }
    
    return createJsonResponse({ status: "success", name: contact.name });
  } catch (error) {
    return createJsonResponse({ error: error.toString() });
  }
}

// Helpers d'écriture dans le Sheet
function updateSheetRow(sheet, headers, rowNum, contact) {
  for (var headerName in COLUMN_MAP) {
    var key = COLUMN_MAP[headerName];
    var colIdx = headers.indexOf(headerName);
    if (colIdx !== -1 && contact[key] !== undefined) {
      sheet.getRange(rowNum, colIdx + 1).setValue(contact[key]);
    }
  }
}

function appendSheetRow(sheet, headers, contact) {
  var row = [];
  for (var j = 0; j < headers.length; j++) {
    var headerName = headers[j];
    var key = COLUMN_MAP[headerName];
    row.push(contact[key] !== undefined ? contact[key] : "");
  }
  sheet.appendRow(row);
}

// Générateur de réponse JSON avec gestion des redirections CORS
function createJsonResponse(data) {
  return ContentService.createTextOutput(JSON.stringify(data))
    .setMimeType(ContentService.MimeType.JSON);
}
```

4. Cliquez sur la disquette en haut pour **Enregistrer le projet** (vous pouvez renommer le projet "Paraffine Sync" en haut à gauche).

---

## Étape 2 : Déployer le script en tant qu'Application Web

1. En haut à droite de l'écran Apps Script, cliquez sur le bouton bleu **Déployer** > **Nouveau déploiement**.
2. Cliquez sur l'engrenage à côté de "Sélectionner le type" et choisissez **Application Web**.
3. Remplissez les options suivantes :
   * **Description** : `Synchro Paraffine Tracker`
   * **Exécuter en tant que** : `Moi (votre-adresse@gmail.com)`
   * **Qui a accès** : `Tout le monde` *(C'est nécessaire pour que votre application locale puisse communiquer avec. Rassurez-vous, l'URL contient un identifiant unique complexe et n'est partagée avec personne).*
4. Cliquez sur **Déployer**.
5. Google va vous demander d'**Autoriser l'accès**. Cliquez sur "Autoriser l'accès", sélectionnez votre compte Google, cliquez sur "Paramètres avancés" en bas à gauche, puis sur "Accéder au projet (non sécurisé)", et enfin sur "Autoriser".
6. Une fois le déploiement réussi, copiez l'**URL de l'application Web** (elle commence par `https://script.google.com/macros/s/.../exec`).

---

## Étape 3 : Activer la synchro dans votre Prospect Tracker

1. Ouvrez votre application locale [index.html](file:///Users/trillatgermain/.gemini/antigravity-ide/scratch/paraffine-crm/index.html) dans le navigateur.
2. En bas à droite dans le pied de page, cliquez sur le bouton **🔗 Synchro Google Sheet**.
3. Collez l'URL copiée à l'étape précédente dans le champ de saisie.
4. Cliquez sur **Activer**.

C'est tout ! 🎉
* **À l'ouverture du tracker** : Il récupèrera automatiquement la liste à jour depuis le Google Sheet.
* **Lors d'une sauvegarde ou création** : Le Google Sheet sera mis à jour en arrière-plan en temps réel.
* **Bouton de Synchro manuelle** : Le bouton "Synchro" à côté du champ URL vous permet de forcer une récupération de la feuille Google Sheet à tout moment si vous y faites des changements à la main.
