const { logSh } = require('./ErrorReporting'); // Using unified logSh from ErrorReporting /** * 🚀 TRIGGER MANUEL - Lit ligne 2 et lance le workflow * ExĂ©cute cette fonction depuis l'Ă©diteur Apps Script */ function runWorkflowLigne(numeroLigne = 2) { cleanLogSheet(); // Nettoie les logs pour ce test try { logSh('🎬 >>> DÉMARRAGE WORKFLOW MANUEL <<<', 'INFO'); // 1. LIRE AUTOMATIQUEMENT LA LIGNE INDIQUÉ const csvData = readCSVDataFromRow(numeroLigne); logSh(`✅ DonnĂ©es lues - MC0: ${csvData.mc0}`, 'INFO'); logSh(`✅ Titre: ${csvData.t0}`, 'INFO'); logSh(`✅ PersonnalitĂ©: ${csvData.personality.nom}`, 'INFO'); // 2. XML TEMPLATE SIMPLE POUR TEST (ou lit depuis Digital Ocean si configurĂ©) const xmlTemplate = getXMLTemplateForTest(csvData); logSh(`✅ XML template: ${xmlTemplate.length} caractĂšres`, 'INFO'); // 3. 🎯 LANCER LE WORKFLOW PRINCIPAL const workflowData = { csvData: csvData, xmlTemplate: Utilities.base64Encode(xmlTemplate), source: 'manuel_ligne2' }; const result = handleFullWorkflow(workflowData); logSh('🏆 === WORKFLOW MANUEL TERMINÉ ===', 'INFO'); // ← EXTRAIRE LES VRAIES DONNÉES let actualData; if (result && result.getContentText) { // C'est un ContentService, extraire le JSON actualData = JSON.parse(result.getContentText()); } else { actualData = result; } logSh(`Type result: ${typeof result}`, 'DEBUG'); logSh(`Result keys: ${Object.keys(result || {})}`, 'DEBUG'); logSh(`ActualData keys: ${Object.keys(actualData || {})}`, 'DEBUG'); logSh(`ActualData: ${JSON.stringify(actualData)}`, 'DEBUG'); if (actualData && actualData.stats) { logSh(`📊 ÉlĂ©ments gĂ©nĂ©rĂ©s: ${actualData.stats.contentPieces}`, 'INFO'); logSh(`📝 Nombre de mots: ${actualData.stats.wordCount}`, 'INFO'); } else { logSh('⚠ Format rĂ©sultat inattendu', 'WARNING'); logSh('ActualData: ' + JSON.stringify(actualData, null, 2), 'DEBUG'); // Using logSh instead of console.log } return actualData; } catch (error) { logSh(`❌ ERREUR WORKFLOW MANUEL: ${error.toString()}`, 'ERROR'); logSh(`Stack: ${error.stack}`, 'ERROR'); throw error; } } /** * HELPER - Lire CSV depuis une ligne spĂ©cifique */ function readCSVDataFromRow(rowNumber) { const sheetId = '1iA2GvWeUxX-vpnAMfVm3ZMG9LhaC070SdGssEcXAh2c'; const spreadsheet = SpreadsheetApp.openById(sheetId); const articlesSheet = spreadsheet.getSheetByName('instructions'); // Lire la ligne complĂšte (colonnes A Ă  H) const range = articlesSheet.getRange(rowNumber, 1, 1, 9); const [slug, t0, mc0, tMinus1, lMinus1, mcPlus1, tPlus1, lPlus1, xmlFileName] = range.getValues()[0]; logSh(`📖 Lecture ligne ${rowNumber}: ${slug}`, 'DEBUG'); // RĂ©cupĂ©rer personnalitĂ©s et sĂ©lectionner automatiquement const personalitiesSheet = spreadsheet.getSheetByName('Personnalites'); const personalities = getPersonalities(personalitiesSheet); const selectedPersonality = selectPersonalityWithAI(mc0, t0, personalities); return { rowNumber: rowNumber, slug: slug || 'test-slug', t0: t0 || 'Titre par dĂ©faut', mc0: mc0 || 'mot-clĂ© test', tMinus1: tMinus1 || 'parent', lMinus1: lMinus1 || '/parent', mcPlus1: mcPlus1 || 'mot1,mot2,mot3,mot4', tPlus1: tPlus1 || 'Titre1,Titre2,Titre3,Titre4', lPlus1: lPlus1 || '/lien1,/lien2,/lien3,/lien4', personality: selectedPersonality, xmlFileName: xmlFileName ? xmlFileName.toString().trim() : null }; } /** * HELPER - XML Template simple pour test (ou depuis Digital Ocean) */ function getXMLTemplateForTest(csvData) { logSh("csvData.xmlFileName: " + csvData.xmlFileName, 'DEBUG'); // Using logSh instead of console.log if (csvData.xmlFileName) { logSh("Tentative Digital Ocean...", 'INFO'); // Using logSh instead of console.log try { return fetchXMLFromDigitalOceanSimple(csvData.xmlFileName); } catch (error) { // ← ENLÈVE LE CATCH SILENCIEUX logSh("Erreur DO: " + error.toString(), 'WARNING'); // Using logSh instead of console.log logSh(`❌ ERREUR DO DÉTAILLÉE: ${error.toString()}`, 'ERROR'); // Continue sans Digital Ocean } } logSh("❌ FATAL: Aucun template XML disponible", 'ERROR'); throw new Error("FATAL: Template XML indisponible (Digital Ocean inaccessible + pas de fallback) - arrĂȘt du workflow"); }