GOOGLE ADS

vendredi 15 avril 2022

Deux scripts d'application s'exécutant sur Forms et Sheets, doivent les connecter tous les deux

J'ai un formulaire d'intégration qui place toutes les réponses dans une feuille Google qui a un script d'application en cours d'exécution pour ajouter un utilisateur à l'administrateur Google et à différents groupes en prenant les valeurs de la dernière ligne de la feuille. Cela fonctionne bien, c'est juste que je dois exécuter le script à chaque fois que le formulaire est rempli, donc je veux créer un déclencheur de formulaire.

Il était logique de créer un déclencheur de soumission de formulaire sur le script d'application attaché au formulaire Google et j'ai ajouté la bibliothèque et l'identifiant de script de l'autre appscipt et j'ai extrait une méthode à partir de là comme telle


// Create a form submit installable trigger
// using Apps Script.
function createFormSubmitTrigger() {
// Get the form object.
var form = FormApp.getActiveForm();
// Since we know this project should only have a single trigger
// we'll simply check if there are more than 0 triggers. If yes,
// we'll assume this function was already run so we won't create
// a trigger.
var currentTriggers = ScriptApp.getProjectTriggers();
if(currentTriggers.length > 0)
return;

// Create a trigger that will run the onFormSubmit function
// whenever the form is submitted.
ScriptApp.newTrigger("onFormSubmit").forForm(form).onFormSubmit().create();
}
function wait(ms){
var start = new Date().getTime();
var end = start;
while(end < start + ms) {
end = new Date().getTime();
}
}
function onFormSubmit() {
wait(7000);
AddingUserAutomation.createUserFromSheets()
}

Le problème est que j'obtiens l'erreur

TypeError: Cannot read property 'getLastRow' of null
at createUserFromSheets(Code:43:19)

My createUserFromSheets function is taking the active sheet

function createUserFromSheets(){
let data = SpreadsheetApp.getActiveSheet();
let row = data.getLastRow();
let firstname = data.getRange(row,2).getValue();
let lastname = data.getRange(row,3).getValue();
... etc etc
}

Je pense qu'il est incapable d'extraire la partie getActiveSheet, c'est pourquoi j'avais ajouté la fonction wait() sur formSubmit() mais cela ne fonctionnerait toujours pas.

Existe-t-il un moyen de résoudre ce problème ou une meilleure façon de le faire?

function createWorkspaceUser(recentResponse) {
console.log("Creating account for:\n"+recentResponse[1]);
debugger;
var user = {"primaryEmail": recentResponse[0] + '.' + recentResponse[1] + '@' + recentResponse[3],
"name": {
"givenName": recentResponse[0],
"familyName": recentResponse[1]
},
"password": newPassword(),
};
try {
user = AdminDirectory.Users.insert(user);
console.log('User %s created with ID %s.', user.primaryEmail, user.id);
}catch(err) {
console.log('Failed with error %s', err.message);
}
}

Je le fais de cette façon mais il exécute une erreur sur primaryemail


Solution du problème

Suggestion [MISE À JOUR]

Comme mentionné par RemcoE33

Pour avoir une configuration plus simplifiée, ignorez peut-être la partie bibliothèque et faites tout le script (script lié ) dans votre formulaire Google lui-même.

Étant donné que nous n'avons pas la vue d'ensemble complète de votre formulaire Google actuel. Voir cet exemple ci-dessous comme référence :

Script de formulaire Google

function onFormSubmit() {
var form = FormApp.getActiveForm();
var count = 0;
var recentResponse = [];
var formResponses = form.getResponses();
for (var i in formResponses) {
count += 1;
var formResponse = formResponses[i];
var itemResponses = formResponse.getItemResponses();
for (var j = 0; j < itemResponses.length; j++) {
if(formResponses.length === count){ //Process only the recently submitted response
var itemResponse = itemResponses[j];
recentResponse.push(itemResponse.getResponse())
}
}
}
createWorkspaceUser(recentResponse);
}
function createWorkspaceUser(recentResponse){
console.log("Creating account for:\n"+recentResponse[2]);
var user = {"primaryEmail": recentResponse[2],
"name": {
"givenName": recentResponse[0],
"familyName": recentResponse[1]
},
"password":recentResponse[3],
"orgUnitPath":recentResponse[4]
};
try{
user = AdminDirectory.Users.insert(user);
console.log('User %s created with ID %s.', user.primaryEmail, user.id);
}catch (err) {
console.log('Failed with error %s', err.message);
}
}

REMARQUE: vous n'avez plus besoin de créer un on form submitdéclencheur puisque leonFormSubmit() fonction s'exécutera automatiquement juste après avoir appuyé sur le bouton d'envoi.

Manifestation

1. Soumettez les données utilisateur à partir d'un exemple de formulaire :

entrez la description de l'image ici

2. Un compte utilisateur test sera créé sur les utilisateurs de la console d'administration Workspace :

entrez la description de l'image ici

Référence


  • https://developers.google.com/apps-script/reference/forms/form-response

  • https://developers.google.com/apps-script/guides/triggers

Aucun commentaire:

Enregistrer un commentaire

Comment utiliseriez-vous .reduce() sur des arguments au lieu d'un tableau ou d'un objet spécifique&nbsp;?

Je veux définir une fonction.flatten qui aplatit plusieurs éléments en un seul tableau. Je sais que ce qui suit n'est pas possible, mais...