Connexion PIM Akeneo – Google sheet

Le PIM Akeneo permet d’exporter et d’importer des données au format Excel ou CSV très facilement, mais cela nécessite de manipuler les données manuellement. Connecter le PIM Akeneo avec Google Sheet va permettre de créer des règles automatiques dans Google Sheet afin de manipuler plus facilement les données, ou de créer des tableaux de suivi.

API PIM Akeneo

La documentation complète est disponible sur le site Akeneo.

L’API nécessite d’obtenir un token (jeton d’authentification), nous allons donc créer un premier script pour récupérer le token.

function getAccessToken() {
  // Préparation de la demande
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("connexion");
  var url = sheet.getRange("B2").getValue();
  var clientId = sheet.getRange("B3").getValue();
  var clientSecret = sheet.getRange("B4").getValue();
  var apiUsername = sheet.getRange("B5").getValue();
  var apiPassword = sheet.getRange("B6").getValue();

  
  // Encodage du clientID et clientScret
  var encodedCredentials = Utilities.base64Encode(clientId + ":" + clientSecret);
  
  // Requête
  var options = {
    "method" : "post",
    "headers": {
      "Content-Type": "application/json",
      "Authorization": "Basic " + encodedCredentials
    },
    "payload": JSON.stringify({
      "grant_type": "password",
      "username": apiUsername,
      "password": apiPassword
    })
  };
  var response = UrlFetchApp.fetch(url+"/api/oauth/v1/token", options);
  var data = JSON.parse(response.getContentText());
  var accessToken = data.access_token;
  var refreshToken = data.refresh_token;
  
  sheet.getRange("B8").setValue(accessToken);
  sheet.getRange("B9").setValue(refreshToken);
  return accessToken;
}

A vous d’adapter les valeurs en fonction de votre fichier.

Récupération des produits via l’API Akeneo et intégration dans Google Sheet

Dans notre cas, l’utilisation de l’API n’est pas juste de récupérer toutes les données des produits, c’est de mettre en place des fonctions, des rapports, et donc nous devons conserver toujours la même structure de données dans nos tableaux. Nous allons donc sélectionner la position de chaque attribut dans notre table de données. Cela rend l’API un peu plus complexe, mais cela évitera tout décalage de données si un nouvel attribut est créé.

function getProductInformation() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("connexion");
  var sheetProducts = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("products");
  var accessToken = sheet.getRange("B8").getValue();
  var baseUrl = sheet.getRange("B2").getValue();
  var searchCanal = sheet.getRange("B11").getValue();
  var searchLocale = sheet.getRange("B12").getValue();
  var limit = 100;
  var data = [];

  // Préparation de la demande initiale
  var url = baseUrl + "/api/rest/v1/products?pagination_type=search_after&limit=" + limit + "&scope=" + searchCanal + "&locales=" + searchLocale;
  var options = {
    "method" : "get",
    "headers": {
      "Authorization": "Bearer " + accessToken,
      "Accept": "application/json"
    }
  };

  // Exécution de la demande
  while (url) {
    var response = UrlFetchApp.fetch(url, options);
    var json = JSON.parse(response.getContentText());
    var items = json._embedded.items;
    for (var i = 0; i < items.length; i++) {
      var item = items[i];
      var values = item.values;
      var row = [];
      row.push(item.identifier);
      row.push(item.categories);
      row.push(item.enabled);
      row.push(item.family);
      row.push(item.parent);
      row.push(item.group);
      
	if (values.sku && values.sku[0]) {
        row.push(values.sku[0].data);
        } else { 
  row.push("");
      };if (values.meta_description && values.meta_description[0]) {
        row.push(values.meta_description[0].data);
        } else {
  row.push("");
      };if (values.meta_title && values.meta_title[0]) {
        row.push(values.meta_title[0].data);
        } else {
  row.push("");
      };if (values.nom_produit && values.nom_produit[0]) {
        row.push(values.nom_produit[0].data);
        } else {
  row.push("");
      };
      data.push(row);
    }

    if (json._links.next) {
      url = json._links.next.href;
    } else {
      url = null;
    }
  }

  // Ajout des données à la feuille "products"
  sheetProducts.getRange("A1").clearContent();
  sheetProducts.getRange("A1").offset(0, 0, data.length, data[0].length).setValues(data);
  return data;
}

Vous pouvez ajouter autant d’attributs que vous le souhaitez, avant data.push(row), ajouter l’attribut que vous souhaitez avec le code suivant : if (values.CODE_ATTRIBUT && values.CODE_ATTRIBUT[0]) { row.push(values.CODE_ATTRIBUT[0].data);} else {row.push(«  »);};. Les attributs s’afficheront dans l’ordre définit dans le script.