From 76339026097c77c1f6b02adabdf1a388ab3ea4cb Mon Sep 17 00:00:00 2001 From: Emil Date: Fri, 27 Nov 2020 21:39:58 +0100 Subject: [PATCH 01/23] =?UTF-8?q?R=C3=A4ttat=20att=20misslyckas=20synkroni?= =?UTF-8?q?sera=20av=20anv=C3=A4ndarkonton=20f=C3=B6r=20distrikt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Anvandare.gs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Anvandare.gs b/Anvandare.gs index b0f0210..58a7f50 100644 --- a/Anvandare.gs +++ b/Anvandare.gs @@ -277,7 +277,7 @@ function checkIfEmailExists(email) { */ function updateAccount(member, useraccount, orgUnitPath) { - if (member.mobile_phone) { //För distrikt som hämtar attribut via e-postlist-api:et då det är annat namn där + if ("district" == organisationType) { //För distrikt som hämtar attribut via e-postlist-api:et då det är annat namn där member.contact_mobile_phone = member.mobile_phone; } From 42c8dc80c2ff3bdf95b07889ae1ae717fe759fff Mon Sep 17 00:00:00 2001 From: Albert Anderberg Date: Sun, 13 Dec 2020 12:08:25 +0100 Subject: [PATCH 02/23] =?UTF-8?q?=C3=84ndra=20fr=C3=A5n=20email=20till=20i?= =?UTF-8?q?d=20i=20anrop=20till=20members.get/update/delete=20som=20workar?= =?UTF-8?q?ound=20f=C3=B6r=20bugg=20i=20googles=20API.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Grupper.gs | 52 +++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 37 insertions(+), 15 deletions(-) diff --git a/Grupper.gs b/Grupper.gs index 0336c3c..57f5ab6 100644 --- a/Grupper.gs +++ b/Grupper.gs @@ -429,7 +429,7 @@ function getGroupMember(groupId, memberkey) { * * @param {string} groupId - Googles id för en grupp * - * @returns {Object[]} members - Lista av medlemsobjekt med attributen email, role för medlemmar i en grupp + * @returns {Object[]} members - Lista av medlemsobjekt med attributen email, role, memberId för medlemmar i en grupp */ function getGroupMembers(groupId) { @@ -452,7 +452,8 @@ function getGroupMembers(groupId) { var tmpEmail = getGmailAdressWithoutDots(member.email.toLowerCase()); var member = { email: tmpEmail, - role: member.role + role: member.role, + memberId: member.id }; group.push(member); } @@ -606,7 +607,7 @@ function updateGroup(selection, rad_nummer, groupId, email, radInfo, grd, listOf if (!contains(allMembers_email, group_members[i].email)) { Logger.log(group_members[i].email + " Borde tas bort från " + groupId + "Google e-postlista"); - deleteGroupMember(groupId, group_members[i].email); + deleteGroupMember(groupId, group_members[i].memberId); } group_members_email.push(group_members[i].email); } @@ -644,27 +645,28 @@ function updateGroup(selection, rad_nummer, groupId, email, radInfo, grd, listOf //Denna e-post finns redan med i gruppen, men har kanske fel roll? else { //Both, Send, Receive - var memberTypeOld = getMembertype(groupId, group_members, allMembers_email[i]) + var memberTypeOld = getMembertype(groupId, group_members, allMembers_email[i]); + var memberId = getMemberId(groupId, group_members, allMembers_email[i]) //Logger.log(allMembers_email[i] + " fanns redan på listan med rollen " + memberTypeOld); if (contains(allMembers_both_email, allMembers_email[i])) { //Ska kunna skicka och ta emot if (memberTypeOld!="Both") { //Har någon annan roll sedan innan - updateGroupMember(groupId, allMembers_email[i], 'MANAGER', 'ALL_MAIL'); + updateGroupMember(groupId, memberId, allMembers_email[i], 'MANAGER', 'ALL_MAIL'); Logger.log(allMembers_email[i] + " fanns redan på listan med rollen " + memberTypeOld); Logger.log(allMembers_email[i] + " har nu rollen skicka och ta emot"); } } else if (contains(allMembers_send_email, allMembers_email[i])) { //Ska bara kunna skicka if (memberTypeOld!="Send") { //Har någon annan roll sedan innan - updateGroupMember(groupId, allMembers_email[i], 'MANAGER', 'NONE'); + updateGroupMember(groupId, memberId, allMembers_email[i], 'MANAGER', 'NONE'); Logger.log(allMembers_email[i] + " fanns redan på listan med rollen " + memberTypeOld); Logger.log(allMembers_email[i] + " har nu rollen bara skicka"); } } else if (contains(allMembers_receive_email, allMembers_email[i])) { //Ska bara kunna ta emot if (memberTypeOld!="Receive") { //Har någon annan roll sedan innan - updateGroupMember(groupId, allMembers_email[i], 'MEMBER', 'ALL_MAIL'); + updateGroupMember(groupId, memberId, allMembers_email[i], 'MEMBER', 'ALL_MAIL'); Logger.log(allMembers_email[i] + " fanns redan på listan med rollen " + memberTypeOld); Logger.log(allMembers_email[i] + " har nu rollen bara ta emot"); } @@ -672,14 +674,14 @@ function updateGroup(selection, rad_nummer, groupId, email, radInfo, grd, listOf else if (contains(allMembers_both_email_admin, allMembers_email[i])) { //Ska kunna skicka och ta emot ADMIN if (memberTypeOld!="OWNER_Both") { //Har någon annan roll sedan innan - updateGroupMember(groupId, allMembers_email[i], 'OWNER', 'ALL_MAIL'); + updateGroupMember(groupId, memberId, allMembers_email[i], 'OWNER', 'ALL_MAIL'); Logger.log(allMembers_email[i] + " fanns redan på listan med rollen " + memberTypeOld); Logger.log(allMembers_email[i] + " har nu rollen bara ta emot ADMIN"); } } else if (contains(allMembers_send_email_admin, allMembers_email[i])) { //Ska bara kunna skicka ADMIN if (memberTypeOld!="OWNER_Send") { //Har någon annan roll sedan innan - updateGroupMember(groupId, allMembers_email[i], 'OWNER', 'DISABLED'); + updateGroupMember(groupId, memberId, allMembers_email[i], 'OWNER', 'DISABLED'); Logger.log(allMembers_email[i] + " fanns redan på listan med rollen " + memberTypeOld); Logger.log(allMembers_email[i] + " har nu rollen bara skicka ADMIN"); } @@ -753,18 +755,18 @@ function getEmailAdressesofAllActiveGoogleAccounts() { * @param {string} role - Önskad ny roll i gruppen * @param {string} delivery_settings - Inställning för e-postleverans */ -function updateGroupMember(groupId, email, role, delivery_settings) { +function updateGroupMember(groupId, memberId, email, role, delivery_settings) { var settings = { delivery_settings: delivery_settings, role: role }; try { - AdminDirectory.Members.update(settings, groupId, email); + AdminDirectory.Members.update(settings, groupId, memberId); } catch (e) { Logger.log("Kunde inte ändra medlemens rolltyp för e-postadress:" + email); - deleteGroupMember(groupId, email); + deleteGroupMember(groupId, memberId); } } @@ -785,7 +787,7 @@ function getMembertype(groupId, group_members, email) { if (group_members[i].email==email) { if (group_members[i].role=='MANAGER') { - var tmp_GroupMember = getGroupMember(groupId, email); + var tmp_GroupMember = getGroupMember(groupId, group_members[i].memberId); var delivery_settings = tmp_GroupMember.delivery_settings; if(delivery_settings=='ALL_MAIL') { return "Both"; @@ -795,7 +797,7 @@ function getMembertype(groupId, group_members, email) { } } else if (group_members[i].role=='OWNER') { - var tmp_GroupMember = getGroupMember(groupId, email); + var tmp_GroupMember = getGroupMember(groupId, group_members[i].memberId); var delivery_settings = tmp_GroupMember.delivery_settings; if(delivery_settings=='ALL_MAIL') { return "OWNER_Both"; @@ -813,6 +815,26 @@ function getMembertype(groupId, group_members, email) { return "Kunde inte hitta rollen på denna medlem " + email; } +/* + * Returnerar gruppmedlemens id givet dess email + * + * @param {string} groupId - Id för denna grupp + * @param {Objekt[]} group_members - Lista med medlemsobjekt + * @param {string} email - E-postadress för en specifik medlem i gruppen + * + * @returns {string} - Medlems + */ +function getMemberId(groupId, group_members, email) { + + for (var i = 0; i < group_members.length; i++) { + + if (group_members[i].email==email) { + return group_members[i].memberId; + } + } + return email; +} + /* * Flytta runt e-postadresser till korrekt lista om de finns i flera olika @@ -1530,4 +1552,4 @@ function TestReadSpreadSheet() { Logger.log('Namn: ' + data[i][grd["namn"]] + ' E-post: ' + data[i][grd["e-post"]] + ' list-id: ' + data[i][grd["scoutnet_list_id"]] + ' grupp id: ' + data[i][grd["groupId"]]); } return data; -} \ No newline at end of file +} From c9430cd5e5c17edd11006443919da028d23f07c3 Mon Sep 17 00:00:00 2001 From: Emil Date: Sun, 13 Dec 2020 18:06:09 +0100 Subject: [PATCH 03/23] =?UTF-8?q?Sm=C3=A5=C3=A4ndringar=20efter=20senaste?= =?UTF-8?q?=20commit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Grupper.gs | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/Grupper.gs b/Grupper.gs index 57f5ab6..e7866e3 100644 --- a/Grupper.gs +++ b/Grupper.gs @@ -607,7 +607,7 @@ function updateGroup(selection, rad_nummer, groupId, email, radInfo, grd, listOf if (!contains(allMembers_email, group_members[i].email)) { Logger.log(group_members[i].email + " Borde tas bort från " + groupId + "Google e-postlista"); - deleteGroupMember(groupId, group_members[i].memberId); + deleteGroupMember(groupId, group_members[i].memberId, group_members[i].email); } group_members_email.push(group_members[i].email); } @@ -646,7 +646,7 @@ function updateGroup(selection, rad_nummer, groupId, email, radInfo, grd, listOf else { //Both, Send, Receive var memberTypeOld = getMembertype(groupId, group_members, allMembers_email[i]); - var memberId = getMemberId(groupId, group_members, allMembers_email[i]) + var memberId = getMemberId(groupId, group_members, allMembers_email[i]); //Logger.log(allMembers_email[i] + " fanns redan på listan med rollen " + memberTypeOld); @@ -750,7 +750,8 @@ function getEmailAdressesofAllActiveGoogleAccounts() { /* * Uppdatera en persons status i en specifik grupp * - * @param {string} groupId - Id för denna grupp + * @param {string} groupId - Gruppens id hos grupp + * @param {string} memberId - E-postadressens id hos Google * @param {string} email - E-postadress för en specifik medlem i gruppen * @param {string} role - Önskad ny roll i gruppen * @param {string} delivery_settings - Inställning för e-postleverans @@ -766,7 +767,7 @@ function updateGroupMember(groupId, memberId, email, role, delivery_settings) { } catch (e) { Logger.log("Kunde inte ändra medlemens rolltyp för e-postadress:" + email); - deleteGroupMember(groupId, memberId); + deleteGroupMember(groupId, memberId, email); } } @@ -815,6 +816,7 @@ function getMembertype(groupId, group_members, email) { return "Kunde inte hitta rollen på denna medlem " + email; } + /* * Returnerar gruppmedlemens id givet dess email * @@ -822,14 +824,13 @@ function getMembertype(groupId, group_members, email) { * @param {Objekt[]} group_members - Lista med medlemsobjekt * @param {string} email - E-postadress för en specifik medlem i gruppen * - * @returns {string} - Medlems + * @returns {string} - Unik nyckel för gruppen */ function getMemberId(groupId, group_members, email) { - for (var i = 0; i < group_members.length; i++) { - + for (var i = 0; i < group_members.length; i++) { if (group_members[i].email==email) { - return group_members[i].memberId; + return group_members[i].memberId; } } return email; @@ -1029,16 +1030,17 @@ function addGroupMember(groupId, email, role, delivery_settings) { * Tar bort en medlem tillhörande en specifik grupp * * @param {string} groupId - Gruppens id hos Google + * @param {string} memberId - E-postadressens id hos Google * @param {string} email - E-postadress att lägg till */ -function deleteGroupMember(groupId, email) { +function deleteGroupMember(groupId, memberId, email) { Logger.log("groupId " + groupId); Logger.log("email " + email); try { Logger.log("Försöker ta bort " + email); - AdminDirectory.Members.remove(groupId, email); + AdminDirectory.Members.remove(groupId, memberId); } catch (e) { Logger.log("Kan inte ta bort till e-postadress:" + email + " pga " + e.message); @@ -1313,7 +1315,7 @@ function patchAdminGroupSettings(group, email) { /* * Returna en grupp via AdminDirectory * - * @param {string} groupId - Id för gruppen + * @param {string} groupKey - Unik nyckel för gruppen * * @returns {object} - En Googlegrupp */ From b38f1cf5f2076789d15f95dc4fa7c424d3b80ae1 Mon Sep 17 00:00:00 2001 From: Emil Date: Mon, 21 Dec 2020 22:08:20 +0100 Subject: [PATCH 04/23] =?UTF-8?q?Funktioner=20f=C3=B6r=20att=20hj=C3=A4lpa?= =?UTF-8?q?=20till=20med=20migrering=20fr=C3=A5n=20personlig=20drive=20til?= =?UTF-8?q?l=20k=C3=A5rens?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Byta\303\204gare.gs" | 137 +++++++++++++ .../KopiaNy\303\204gare.gs" | 191 ++++++++++++++++++ .../Lista\303\204gare.gs" | 109 ++++++++++ .../\303\204ndraDelning.gs" | 165 +++++++++++++++ 4 files changed, 602 insertions(+) create mode 100644 "Google-drive-migrering/Steg1-ge-bort-\303\244garskap/Byta\303\204gare.gs" create mode 100644 "Google-drive-migrering/Steg2-tvingad-\303\244ndring-fil\303\244gare/KopiaNy\303\204gare.gs" create mode 100644 "Google-drive-migrering/Steg2-tvingad-\303\244ndring-fil\303\244gare/Lista\303\204gare.gs" create mode 100644 "Google-drive-migrering/Steg2-tvingad-\303\244ndring-fil\303\244gare/\303\204ndraDelning.gs" diff --git "a/Google-drive-migrering/Steg1-ge-bort-\303\244garskap/Byta\303\204gare.gs" "b/Google-drive-migrering/Steg1-ge-bort-\303\244garskap/Byta\303\204gare.gs" new file mode 100644 index 0000000..0ce290f --- /dev/null +++ "b/Google-drive-migrering/Steg1-ge-bort-\303\244garskap/Byta\303\204gare.gs" @@ -0,0 +1,137 @@ +/** + * @author Emil Öhman + * @website https://github.com/Scouterna + */ + + +/** + * Funktion för att ge bort ägarskap för filer och mappar + */ +function changeOwnership() { + + //Fyll i här vem som ska bli den nya ägaren av filerna + var emailOfNewOwner = "webmaster@dinegnascoutkår.se"; + + //Fyll i här domänen för den som ska bli den nya ägaren + var domain = "dinegnascoutkår.se"; + + //Mappen vi ska leta filer i + //T.ex https://drive.google.com/drive/u/0/folders/qwer-asdfghjklzxcvbnmqwertyuio + var folderId = "qwer-asdfghjklzxcvbnmqwertyuio"; + + + if (!emailOfNewOwner.endsWith(domain)) { + Logger.log("Felaktig domän på e-postadress!!"); + return; + } + + //Din e-postadress för att veta vilka filer/mappar vi kan ändra ägare på + var yourEmail = Session.getActiveUser().getEmail(); + Logger.log("Din e-post " + yourEmail); + + //Anropar functionen som ska byta ägare på alla filer + changeFileAndFolderOwnership(folderId, emailOfNewOwner, yourEmail); +} + + +/** + * Rekursiv funktion för att byta ägare på filer och mappar du äger + * + * @param {string} folderId - Id för en Google-mapp + * @param {string} emailOfNewOwner - E-postadress för den nya ägaren + * @param {string} yourEmail - Din e-postadress som kör skriptet + */ +function changeFileAndFolderOwnership(folderId, emailOfNewOwner, yourEmail) { + + //Hämta mappen vi ska leta filer i + var folder = DriveApp.getFolderById(folderId); + + if (!folder) { + Logger.log("Du kör fel funktion!!"); + return; + } + + //Hämta alla filer som finns i denna mapp + var files = folder.getFiles(); + + while(files.hasNext()) { + try { + //Kollar nästa fil + var file = files.next(); + + //Vad filen heter + var fileName = file.getName(); + + //Vem som äger filen innan + var oldFileOwner = file.getOwner().getEmail(); + + if (oldFileOwner == yourEmail) { + Logger.log("Du äger denna fil " + fileName); + + try { + file.addEditor(emailOfNewOwner); + } + catch (e) { + Logger.log(e.message); + } + try { + file.setOwner(emailOfNewOwner); + } + catch (e) { + Logger.log(e.message); + } + Logger.log("Nu äger " + emailOfNewOwner + " denna fil"); + } + else { + Logger.log("Du äger EJ denna fil " + fileName); + } + } + catch(e) { + Logger.log("Problem med fil: " + e); + } + } + + //Hämta alla undermappar som finns i denna mapp + var childFolders = folder.getFolders(); + + while(childFolders.hasNext()) { + try { + //Kollar nästa mapp + var childFolder = childFolders.next(); + + //Vad mappen heter + var childName = childFolder.getName(); + + //Vilket id som mappen har + var childId = childFolder.getId(); + + //Vem som äger mappen innan + var oldChildFolderOwner = childFolder.getOwner().getEmail(); + + if (oldChildFolderOwner == yourEmail) { + Logger.log("Du äger denna mapp " + childName); + + try { + childFolder.addEditor(emailOfNewOwner); + } + catch (e) { + Logger.log(e.message); + } + try { + childFolder.setOwner(emailOfNewOwner); + } + catch(e){ + Logger.log(e.message); + } + Logger.log("Nu äger " + emailOfNewOwner + " denna mapp"); + } + else { + Logger.log("Du äger EJ denna mapp " + childName); + } + changeFileAndFolderOwnership(childId, emailOfNewOwner, yourEmail); + } + catch(e) { + Logger.log("Problem med mapp: " + e); + } + } +} diff --git "a/Google-drive-migrering/Steg2-tvingad-\303\244ndring-fil\303\244gare/KopiaNy\303\204gare.gs" "b/Google-drive-migrering/Steg2-tvingad-\303\244ndring-fil\303\244gare/KopiaNy\303\204gare.gs" new file mode 100644 index 0000000..8a2b1ff --- /dev/null +++ "b/Google-drive-migrering/Steg2-tvingad-\303\244ndring-fil\303\244gare/KopiaNy\303\204gare.gs" @@ -0,0 +1,191 @@ +/** + * @author Emil Öhman + * @website https://github.com/Scouterna + */ + + +/** + * Funktion för att för de filer du ej äger göra följande: + * - Skapa kopia på filen om filformat är godkänt + * - Ändra data i orginalfilen då det inte går att radera den helt + * - Ta bort din egen åtkomst till orginalfilen så att den försvinner + * - Ta bort ägaren till orginalfilen från den nya kopian + */ +function copyFileNewOwner() { + + var emailOfAdmin = "webmaster@dinegnascoutkår.se"; + + var domain = "dinegnascoutkår.se"; + + //Mappen vi ska leta filer i + //T.ex https://drive.google.com/drive/u/0/folders/qwer-asdfghjklzxcvbnmqwertyuio + var folderId = "qwer-asdfghjklzxcvbnmqwertyuio"; + + + if (!emailOfAdmin.endsWith(domain)) { + Logger.log("Felaktig domän på e-postadress!!"); + return; + } + + //Din e-postadress för att veta vilka filer/mappar vi kan ändra ägare på + var yourEmail = Session.getActiveUser().getEmail(); + Logger.log("Din e-post " + yourEmail); + + //Anropar functionen som ska byta ägare på alla filer + changeFileAndFolderMakeCopy(folderId, yourEmail); +} + + +/** + * Rekursiv funktion för att skapa kopior på filer och ta bort orginalen + * + * @param {string} folderId - Id för en Google-mapp + * @param {string} yourEmail - Din e-postadress som kör skriptet + */ +function changeFileAndFolderMakeCopy(folderId, yourEmail) { + + //Hämta mappen vi ska leta filer i + var folder = DriveApp.getFolderById(folderId); + + if (!folder) { + Logger.log("Du kör fel funktion!!"); + return; + } + + //Hämta alla filer som finns i denna mapp + var files = folder.getFiles(); + + while(files.hasNext()) { + try { + //Kollar nästa fil + var file = files.next(); + + //Vad filen heter + var fileName = file.getName(); + + //Vem som äger filen innan + var oldFileOwner = file.getOwner().getEmail(); + + if (oldFileOwner == yourEmail) { + Logger.log("Du äger denna fil - " + fileName); + } + else { + Logger.log("Du äger EJ denna fil - " + fileName); + makeNewFile(file, folder, yourEmail); + } + } + catch(e) { + Logger.log("Problem med fil: " + e); + } + } + + //Hämta alla undermappar som finns i denna mapp + var childFolders = folder.getFolders(); + + while(childFolders.hasNext()) { + try { + //Kollar nästa mapp + var childFolder = childFolders.next(); + + //Vad mappen heter + var childName = childFolder.getName(); + + //Vilket id som mappen har + var childId = childFolder.getId(); + + changeFileAndFolderMakeCopy(childId, yourEmail); + } + catch(e) { + Logger.log("Problem med mapp: " + e); + } + } +} + + +/** + * Funktion för att skapa en kopia på en fil och ta bort orginalet + * + * @param {Object} file - Ett filobjekt + * @param {Object} folder - Ett mappobjekt + * @param {string} yourEmail - Din e-postadress som kör skriptet + */ +function makeNewFile(file, folder, yourEmail) { + try { + var owner = file.getOwner().getEmail(); + var name = file.getName(); + var mimeType = file.getMimeType(); + + //Filformat på filen + Logger.log("MimeType " + mimeType); + + //Vi ska göra en ny kopia och ta bort den gamla + if (checkMimeTypeIfOkToMakeNew(mimeType)) { + Logger.log("Ok filtyp att kopiera och ta bort"); + + try { + Logger.log("Försöker kopiera filen " + name); + var newFile = file.makeCopy(name, folder); + Logger.log("Nykopierad fil med namn " + newFile.getName()); + + Logger.log("Försöker radera innehållet i orginalfilen " + name); + file.setContent("Denna fils innehåll är borttaget. Kopia finns hos kåren"); + Logger.log("Raderat innehåll i orginalfilen"); + + Logger.log("Försöker radera orginalfilen " + name); + file.revokePermissions(yourEmail); + Logger.log("Raderat orginalfilen från din egna drive"); + + Logger.log("Försöker ta bort gamla filägarens behörighet till den nya filkopian " + name); + newFile.revokePermissions(owner); + Logger.log("Tagit bort behörighet till den nya filkopian för " + owner); + } + catch (e) { + Logger.log(e.message); + } + } + else { + Logger.log("Denna filtyp ska lämnas orörd"); + } + } + catch (e) { + Logger.log(e.message); + } +} + + +/** + * Funktion för att kontrollera om filtypen är ok att röra + * + * @param {string} mimeType - Sträng för en mimetype + * + * @returns {boolean} + */ +function checkMimeTypeIfOkToMakeNew(mimeType) { + + //Listan över de att välja över hittas på + //https://developers.google.com/drive/api/v3/ref-export-formats + + var mimeTypesToTouch = [ + "text/plain", + "application/rtf", + "application/vnd.oasis.opendocument.text", + "application/pdf", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "application/vnd.ms-excel", + "application/x-vnd.oasis.opendocument.spreadsheet", + "text/csv", + "text/tab-separated-values", + "image/jpeg", + "image/png", + "image/svg+xml", + "application/vnd.openxmlformats-officedocument.presentationml.presentation", + "application/vnd.oasis.opendocument.presentation", + "application/vnd.google-apps.document" + ]; + + if (mimeTypesToTouch.includes(mimeType)) { + return true; + } + return false; +} diff --git "a/Google-drive-migrering/Steg2-tvingad-\303\244ndring-fil\303\244gare/Lista\303\204gare.gs" "b/Google-drive-migrering/Steg2-tvingad-\303\244ndring-fil\303\244gare/Lista\303\204gare.gs" new file mode 100644 index 0000000..1d847f7 --- /dev/null +++ "b/Google-drive-migrering/Steg2-tvingad-\303\244ndring-fil\303\244gare/Lista\303\204gare.gs" @@ -0,0 +1,109 @@ +/** + * @author Emil Öhman + * @website https://github.com/Scouterna + */ + + +/** + * Anropa denna funktion om du vill få fram en lista över vilka + * e-postadresser som äger en fil eller undermapp till angiven mapp + */ +function ListOwnerships() { + + //Mappen vi ska leta filer i + //T.ex https://drive.google.com/drive/u/0/folders/qwer-asdfghjklzxcvbnmqwertyuio + var folderId = "qwer-asdfghjklzxcvbnmqwertyuio"; + + + //Din e-postadress för att veta vilka filer/mappar vi kan ändra ägare på + var yourEmail = Session.getActiveUser().getEmail(); + Logger.log("Din e-post " + yourEmail); + + //Lista med de ägare för filer och mappar som hittats + var listOfOwners = []; + + //Anropar functionen som ska byta ägare på alla filer + listFileAndFolderOwnership(folderId, listOfOwners); + + var uniqueListOfOwners = listOfOwners.filter(onlyUnique); + Logger.log("**************"); + Logger.log("Nedan är de olika ägare för tillhörande undermappar filer som finns"); + Logger.log(uniqueListOfOwners); +} + + +/** + * Rekursiv funktion för att söka igenom filer i aktuell mapp + * och sen ta en titt i nästa mapp osv. + * + * @param {string} folderId - Id för en Google-mapp + * @param {string[]} listOfOwners - Lista över fil och mappägare + */ +function listFileAndFolderOwnership(folderId, listOfOwners) { + + //Hämta mappen vi ska leta filer i + var folder = DriveApp.getFolderById(folderId); + + if (!folder) { + Logger.log("Du kör fel funktion!!"); + return; + } + + //Hämta alla filer som finns i denna mapp + var files = folder.getFiles(); + + while (files.hasNext()) { + try { + //Kollar nästa fil + var file = files.next(); + + //Vad filen heter + var fileName = file.getName(); + Logger.log(fileName); + + //Vem som äger filen + var oldFileOwner = file.getOwner().getEmail(); + listOfOwners.push(oldFileOwner); + } + catch (e) { + Logger.log("Problem med fil: " + e); + } + } + + + //Hämta alla undermappar som finns i denna mapp + var childFolders = folder.getFolders(); + + while (childFolders.hasNext()) { + try { + //Kollar nästa mapp + var childFolder = childFolders.next(); + + //Vad mappen heter + var childName = childFolder.getName(); + Logger.log(childName); + + //Vilket id som mappen har + var childId = childFolder.getId(); + + //Vem som äger mappen innan + var oldChildFolderOwner = childFolder.getOwner().getEmail(); + listOfOwners.push(oldChildFolderOwner); + + listFileAndFolderOwnership(childId, listOfOwners); + } + catch (e) { + Logger.log("Problem med mapp: " + e); + } + } +} + + +/** + * Funktion för att returnera en ny lista med unika element + * + * Anropas genom {string[]}.filter(onlyUnique); + */ +function onlyUnique(value, index, self) { + return self.indexOf(value) === index; +} diff --git "a/Google-drive-migrering/Steg2-tvingad-\303\244ndring-fil\303\244gare/\303\204ndraDelning.gs" "b/Google-drive-migrering/Steg2-tvingad-\303\244ndring-fil\303\244gare/\303\204ndraDelning.gs" new file mode 100644 index 0000000..e0d3e9f --- /dev/null +++ "b/Google-drive-migrering/Steg2-tvingad-\303\244ndring-fil\303\244gare/\303\204ndraDelning.gs" @@ -0,0 +1,165 @@ +/** + * @author Emil Öhman + * @website https://github.com/Scouterna + */ + + +/** + * Funktion för ta bort att filer delas via länk och ta bort redigerare så att + * bara du själv och den som äger filen har tillgång till den + */ +function removeShareSettings() { + + var emailOfAdmin = "webmaster@dinegnascoutkår.se"; + + var domain = "dinegnascoutkår.se"; + + //Mappen vi ska leta filer i + //T.ex https://drive.google.com/drive/u/0/folders/qwer-asdfghjklzxcvbnmqwertyuio + var folderId = "qwer-asdfghjklzxcvbnmqwertyuio"; + + + if (!emailOfAdmin.endsWith(domain)) { + Logger.log("Felaktig domän på e-postadress!!"); + return; + } + + //Din e-postadress för att veta vilka filer/mappar vi kan ändra ägare på + var yourEmail = Session.getActiveUser().getEmail(); + Logger.log("Din e-post " + yourEmail); + + var emailOfNewEditors = []; + emailOfNewEditors.push(emailOfAdmin); + emailOfNewEditors.push(yourEmail); + + var listErrorAccess = []; + + //Anropar functionen som ska byta ägare på alla filer + changeFileAndFolderShareSettings(folderId, emailOfNewEditors, listErrorAccess); + + var uniqueListErrorAccess = listErrorAccess.filter(onlyUnique); + Logger.log("**************"); + Logger.log("Mappar/filer där det inte riktigt gick att ta bort länkdelning är listade nedan om det finns några"); + Logger.log("Detta kan vara för att mappen har annan behörighet för de inom kåren t.ex"); + Logger.log("Testa gå in i den mappen via drive i webbläsaren och ändra för den som är listad först och kör sen prgrammet igen"); + Logger.log(uniqueListErrorAccess); +} + + +/** + * Rekursiv funktion för att ändra delnings- och redigerarbehörighet + * givet en mapp och dess filer och undermappar + * + * @param {string} folderId - Id för en Google-mapp + * @param {string[]} emailOfNewEditors - Lista över de som fortsatt ska ha behörighet förutom ägaren + * @param {string[]} listErrorAccess - Lista över de mappar och filer som ej går att ändra all behörighet på + */ +function changeFileAndFolderShareSettings(folderId, emailOfNewEditors, listErrorAccess) { + + //Hämta mappen vi ska leta filer i + var folder = DriveApp.getFolderById(folderId); + + if (!folder) { + Logger.log("Du kör fel funktion!!"); + return; + } + + //Hämta alla filer som finns i denna mapp + var files = folder.getFiles(); + + while(files.hasNext()) { + try { + //Kollar nästa fil + var file = files.next(); + + //Vad filen heter + var fileName = file.getName(); + + try { + var oldSharingAccess = file.getSharingAccess(); + Logger.log(fileName + " " + oldSharingAccess); + if ("PRIVATE"!=oldSharingAccess) { + file.setSharing(DriveApp.Access.PRIVATE, DriveApp.Permission.EDIT); + Logger.log(fileName + " delas nu ENDAST till de som är specificerade"); + } + } + catch (e) { + listErrorAccess.push("Fil - " + file); + Logger.log(e.message); + } + removeEditors(file, emailOfNewEditors); + } + catch(e) { + Logger.log("Problem med fil: " + e); + } + } + + //Hämta alla undermappar som finns i denna mapp + var childFolders = folder.getFolders(); + + while(childFolders.hasNext()) { + try { + //Kollar nästa mapp + var childFolder = childFolders.next(); + + //Vad mappen heter + var childName = childFolder.getName(); + + //Vilket id som mappen har + var childId = childFolder.getId(); + + try { + var oldSharingAccess = childFolder.getSharingAccess(); + Logger.log(childName + " " + oldSharingAccess); + if ("PRIVATE"!=oldSharingAccess) { + childFolder.setSharing(DriveApp.Access.PRIVATE, DriveApp.Permission.EDIT); + Logger.log(childName + " delas nu ENDAST till de som är specificerade"); + } + } + catch (e) { + listErrorAccess.push("Mapp - " + childName); + Logger.log(e.message); + } + + removeEditors(childFolder, emailOfNewEditors); + + changeFileAndFolderShareSettings(childId, emailOfNewEditors, listErrorAccess); + } + catch(e) { + Logger.log("Problem med mapp: " + e); + } + } +} + + +/** + * Funktion för att ta bort redigerare till en mapp eller fil + * + * @param {string} driveEntry - Ett fil- eller mapp-objekt + * @param {string[]} emailsToSave - Lista över e-postadresser som ej ska tas bort som redigerare + */ +function removeEditors(driveEntry, emailsToSave) { + + try { + var owner = driveEntry.getOwner().getEmail(); + var name = driveEntry.getName(); + Logger.log(name + " " + owner); + + var listOfEditors = driveEntry.getEditors(); + + for (var i = 0; i < listOfEditors.length; i++) { + + if (!emailsToSave.includes(listOfEditors[i].getEmail())) { + + driveEntry.removeEditor(listOfEditors[i].getEmail()); + Logger.log("- " + listOfEditors[i].getEmail() + " borttagen"); + } + else { + Logger.log("- " + listOfEditors[i].getEmail() + " ska lämnas kvar som editor"); + } + } + } + catch (e) { + Logger.log(e.message); + } +} From d9d1b95d47a9895ffa9298757b1cca59d05a6001 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emil=20=C3=96hman?= Date: Mon, 21 Dec 2020 22:55:34 +0100 Subject: [PATCH 05/23] Create README.md --- Google-drive-migrering/README.md | 36 ++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 Google-drive-migrering/README.md diff --git a/Google-drive-migrering/README.md b/Google-drive-migrering/README.md new file mode 100644 index 0000000..7827723 --- /dev/null +++ b/Google-drive-migrering/README.md @@ -0,0 +1,36 @@ +# Migreringsverktyg för Google drive +Dessa program är tänkta att användas för kåren vid migrering från att kåren tidigare har använt vanlig Google drive och att nu börja använda Googles +Delade enheter. + +För att hjälpa till med migreringen har olika skript tagits fram som du kan läsa mer om nedan + +## Skillnad mellan Google drive och Google Delade enheter +Vanliga Google drive kan beskrivas som att varje person som skapar en fil eller mapp äger den och inga andra kan ta bort den utan kan bara ta bort den hos +andra som har tillgång till den och sig själv men ej ta bort den för den som skapat den. Då det ju går att skapa undermappar till andra mappar som andra +har skapat blir det lätt svåröverskådligt med alla olika mapp- eller filägare och det går inte heller att få en hållbar lagringslösning på lång sikt. +Du som ej äger en fil kan ej flytta den till delade enheter utan kan enbart skapa en kopia där. + +Delade enheter fungerar som en vanlig hårddisk på en server. Om någon annan tar bort en fil försvinner den hos alla andra också. + +För att minska risken att ledare använder gamla filer på drive och inte eventuella nya kopior på delade enheter är det bra att ta bort så mycket +delning som möjligt från filer på drive så att enbart du själv och filägaren står kvar för att sen ta bort din egna behörighet också. För att minska +spridning av känsliga uppgifter är det också bra att ta bort känslig data ur filen innan du tar bort din egna behörighet. Tyvärr går det inte att +ta bort filen helt och hållet, så filen kommer finnas kvar och eventuellt kunna återställas om versionshistorik finns. +Skripten hjälper till med detta arbete vilket kan vara omständigt om det görs manuellt. + +## Skript +### Ge bort ditt ägarskap för filer och mappar +Skript för att dela med användare i kåren som har tillgång till en given mapp och undermappar för att flytta deras ägarskap till dig eller given +e-postadress. + +Tips är att köra skriptet om att lista vilka som äger filer och undermappar före du delar detta med kårens funktionärer för att veta vilka du ska skicka +skriptet till. + +### Lista vilka som äger filer och undermappar i en mapp +Skript för att få fram vilka som äger alla filer och undermappar till en given mapp. + +### Ta bort länkdelning och redigerare för filer och undermappar i en mapp +Skript som tar bort länkdelning och redigerare för alla filer och undermappar till en given mapp. De enda som är kvar är fil/mapp-ägaren och du. + +### Skapa nya filer som du själv äger +Skript som skapar filer som du själv äger som är kopior och tar bort orginalfilen för dig. Skriver också över orginalfilen med ny data. From a6bc9d9946789329c4fa212054d1f9d8c72c242e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emil=20=C3=96hman?= Date: Mon, 21 Dec 2020 23:55:01 +0100 Subject: [PATCH 06/23] =?UTF-8?q?Skapat=20Readme=20-=20Ge=20bort=20=C3=A4g?= =?UTF-8?q?arskap?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Steg1-ge-bort-\303\244garskap/README.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 "Google-drive-migrering/Steg1-ge-bort-\303\244garskap/README.md" diff --git "a/Google-drive-migrering/Steg1-ge-bort-\303\244garskap/README.md" "b/Google-drive-migrering/Steg1-ge-bort-\303\244garskap/README.md" new file mode 100644 index 0000000..cb9c2f0 --- /dev/null +++ "b/Google-drive-migrering/Steg1-ge-bort-\303\244garskap/README.md" @@ -0,0 +1,20 @@ +# Skript för att överföra ägarskap för filer och mappar +Skriptet överför ägarskapet för filer och undermappar för en given mapp till ett annat Google-konto. + +## Varför ska vi överföra ägarskapet? +Det optimala är egentligen om alla ledare överför sina egna filer till den nya delade enheten, men då olika personer kan ha sina filer spridda på väldigt +många olika undermappar och kanske bara en enstaka i varje kan det bli ett väldigt omständigt arbete att flytta. + +Du som inte äger en fil på Google drive kan inte ta bort den helt och hållet utan kan enbart ta bort den för dig och andra som har redigerarbehörighet +men den kommer fortsatt finnas kvar hos den som ursprungligen skapade den. +Målet med skriptet är alltså att hjälpa till att samtliga som har tillgång till en mapp överför sitt ägarskap för filer och undermappar till en användare +för att slut bli så att alla enbart tillhör ett konto som då kan flytta alla filer samtidigt. + +## Krav för att överföra ägarskap +För att kunna överföra ägarskap för filer och mappar måste den som överför ägarskapaet ha sitt konto på samma domän som den som ägarskapet önskas +överföras till. + +T.ex kan ett @gmail.com endast överföra ägarskap till ett annat @gmail.com konto och ett konto på kårens domän kan enbart överföra ägarskap till ett +annat konto på kårens domän. Om ni har en blandning av vilka typer av konton ni använt kan du behöva göra två uppsättningar av skripet med olika +e-postadresser för vem den nya ägaren ska vara för att detta skript ska komma till nytta. Alltså ett skript som ändrar den nya ägaren till ditt konto +på kårens domän och det andra som ändrar till ditt privata @gmail.com konto. From 8fc1fb26d1023d51ad068f1cfe21caadaa63e2a6 Mon Sep 17 00:00:00 2001 From: Emil Date: Tue, 22 Dec 2020 21:20:44 +0100 Subject: [PATCH 07/23] =?UTF-8?q?Fyllt=20p=C3=A5=20med=20readme=20f=C3=B6r?= =?UTF-8?q?=20de=20nya=20migreringsfunktionerna?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Google-drive-migrering/README.md | 15 +++++- .../Steg1-ge-bort-\303\244garskap/README.md" | 24 ++++++++- .../KopiaNy\303\204gare.gs" | 18 +++---- .../README.md" | 53 +++++++++++++++++++ 4 files changed, 96 insertions(+), 14 deletions(-) create mode 100644 "Google-drive-migrering/Steg2-tvingad-\303\244ndring-fil\303\244gare/README.md" diff --git a/Google-drive-migrering/README.md b/Google-drive-migrering/README.md index 7827723..4bb0344 100644 --- a/Google-drive-migrering/README.md +++ b/Google-drive-migrering/README.md @@ -2,7 +2,7 @@ Dessa program är tänkta att användas för kåren vid migrering från att kåren tidigare har använt vanlig Google drive och att nu börja använda Googles Delade enheter. -För att hjälpa till med migreringen har olika skript tagits fram som du kan läsa mer om nedan +För att hjälpa till med migreringen har olika skript tagits fram som du kan läsa mer om nedan. ## Skillnad mellan Google drive och Google Delade enheter Vanliga Google drive kan beskrivas som att varje person som skapar en fil eller mapp äger den och inga andra kan ta bort den utan kan bara ta bort den hos @@ -30,7 +30,18 @@ skriptet till. Skript för att få fram vilka som äger alla filer och undermappar till en given mapp. ### Ta bort länkdelning och redigerare för filer och undermappar i en mapp -Skript som tar bort länkdelning och redigerare för alla filer och undermappar till en given mapp. De enda som är kvar är fil/mapp-ägaren och du. +Skript som tar bort länkdelning och redigerare för alla filer och undermappar till en given mapp. De enda som är kvar är fil/mapp-ägaren och du själv. ### Skapa nya filer som du själv äger Skript som skapar filer som du själv äger som är kopior och tar bort orginalfilen för dig. Skriver också över orginalfilen med ny data. + +## Förslag till utförandesteg +1. Ladda ner en kopia från Google drive för den mappen du vill flytta för att ha som säkerhetskopia. +1. Sätt upp alla skripten enligt instruktionerna. +1. Kör skriptet `ListaÄgare` för att få fram e-postadresser på vilka som äger alla filer och undermappar. +1. Skicka ett mejl och dela skriptet `BytaÄgare` enligt instruktionen till de det berör. Du kommer få massor av e-brev när någon kör skriptet så att du vet. Se också till att de du skickar skriptet till har e-postkonto på samma domän som de ska överföra ägarskapet till. +1. Nu är förhoppningsvis allt överfört till dig om alla har kört skriptet. Kör skriptet `ListaÄgare` för att se om det nu bara är du som är listad som ägare. +1. När du är nöjd; kör skriptet `ÄndraDelning` för att se till så att inte alla längre har tillgång till alla filer. Det kan behövas lite manuellt arbete med ändring av behörighetsdelning efter körningen om inte programmet lyckas ändra på alla ställen. +1. Kör skriptet `KopiaNyÄgare` för att skapa kopior på de filer som du ej äger så att du nu äger de nya filerna. Orginalfilerna skrivs över och raderas htl för alla förutom orginalägaren. +1. Kör skriptet `ÄndraDelning` igen då det kan ha blivit problem med att ta bort behörigheten för ägaren till orginalfilerna från kopian. +1. Börja flytta över alla filer till den delade enheten. Mapparna får du skapa på nytt på den delade enheten och de gamla mapparna ska raderas. diff --git "a/Google-drive-migrering/Steg1-ge-bort-\303\244garskap/README.md" "b/Google-drive-migrering/Steg1-ge-bort-\303\244garskap/README.md" index cb9c2f0..ab7c0cc 100644 --- "a/Google-drive-migrering/Steg1-ge-bort-\303\244garskap/README.md" +++ "b/Google-drive-migrering/Steg1-ge-bort-\303\244garskap/README.md" @@ -11,10 +11,32 @@ Målet med skriptet är alltså att hjälpa till att samtliga som har tillgång för att slut bli så att alla enbart tillhör ett konto som då kan flytta alla filer samtidigt. ## Krav för att överföra ägarskap -För att kunna överföra ägarskap för filer och mappar måste den som överför ägarskapaet ha sitt konto på samma domän som den som ägarskapet önskas +För att kunna överföra ägarskap för filer och mappar måste den som överför ägarskapet ha sitt konto på samma domän som den som ägarskapet önskas överföras till. T.ex kan ett @gmail.com endast överföra ägarskap till ett annat @gmail.com konto och ett konto på kårens domän kan enbart överföra ägarskap till ett annat konto på kårens domän. Om ni har en blandning av vilka typer av konton ni använt kan du behöva göra två uppsättningar av skripet med olika e-postadresser för vem den nya ägaren ska vara för att detta skript ska komma till nytta. Alltså ett skript som ändrar den nya ägaren till ditt konto på kårens domän och det andra som ändrar till ditt privata @gmail.com konto. + +## Inställningar +1. Besök i första hand när du är inloggad på kårens webbansvariges Google-konto eller annat lämpligt Google-konto med hög behörighet på kårens Google Workspace den mapp på Google drive där du vill lagra projektet. Där skapar du en ny fil på formatet Google Apps Script. Om det inte finns att välja på ska du besöka script.google.com när du är inloggad och trycka på "Nytt Script" och namnge sedan projektet till något lämpligt, t.ex Byta ägare. Om du ska dela skriptet för olika mappar till olika personer är det lämpligt att skriva i projektnamnet också vilken mapp det är frågan om. +1. Till vänster på skärmen listas de olika filer som finns i projektet och nu vid starten finns endast en som heter Code.gs. Byt namn på den till "BytaÄgare" och ta bort den koden som står i filen. +1. Klistra in koden från filen BytaÄgare.gs och spara (Ctrl+S). +1. Ändra följande variabler i koden + - Styr till vilket Google-konto som skriptet ska försöka överföra ägarskapet till. + - ``` + var emailOfNewOwner = "webmaster@dinegnascoutkår.se"; + ``` + - Vilken domän som Google-kontot tillhör som försöker överföra ägarskapet till. Som en liten extra koll att du fyller i rätt e-postadress. + - ``` + var domain = "dinegnascoutkår.se"; + ``` + - Vilket id som Google drive-mappen har. Hittas som enligt exemplet i koden som den sista delen i webbadressen när du besöker Google drive-mappen. + - ``` + var folderId = "qwer-asdfghjklzxcvbnmqwertyuio"; + ``` +1. Ta reda på vilka du ska skicka skriptet till. +2. Ändra delningsinställningarna för skriptet via inställningarna uppe till höger. Förslagsvis så att andra enbart kan visa skriptet och inte ändra. +3. Dela länken till skriptet och be dem köra det genom att trycka på `Run`. + - Observera att du kommer att få ett mejl till din inkorg för alla filer som skriptet påverkar när någon kör det, så det rekommenderas att vara beredd på det. diff --git "a/Google-drive-migrering/Steg2-tvingad-\303\244ndring-fil\303\244gare/KopiaNy\303\204gare.gs" "b/Google-drive-migrering/Steg2-tvingad-\303\244ndring-fil\303\244gare/KopiaNy\303\204gare.gs" index 8a2b1ff..14b7794 100644 --- "a/Google-drive-migrering/Steg2-tvingad-\303\244ndring-fil\303\244gare/KopiaNy\303\204gare.gs" +++ "b/Google-drive-migrering/Steg2-tvingad-\303\244ndring-fil\303\244gare/KopiaNy\303\204gare.gs" @@ -12,20 +12,11 @@ * - Ta bort ägaren till orginalfilen från den nya kopian */ function copyFileNewOwner() { - - var emailOfAdmin = "webmaster@dinegnascoutkår.se"; - - var domain = "dinegnascoutkår.se"; - + //Mappen vi ska leta filer i //T.ex https://drive.google.com/drive/u/0/folders/qwer-asdfghjklzxcvbnmqwertyuio var folderId = "qwer-asdfghjklzxcvbnmqwertyuio"; - - if (!emailOfAdmin.endsWith(domain)) { - Logger.log("Felaktig domän på e-postadress!!"); - return; - } //Din e-postadress för att veta vilka filer/mappar vi kan ändra ägare på var yourEmail = Session.getActiveUser().getEmail(); @@ -162,6 +153,8 @@ function makeNewFile(file, folder, yourEmail) { */ function checkMimeTypeIfOkToMakeNew(mimeType) { + //return true; + //Listan över de att välja över hittas på //https://developers.google.com/drive/api/v3/ref-export-formats @@ -172,7 +165,9 @@ function checkMimeTypeIfOkToMakeNew(mimeType) { "application/pdf", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "application/msword", "application/vnd.ms-excel", + "application/vnd.ms-powerpoint", "application/x-vnd.oasis.opendocument.spreadsheet", "text/csv", "text/tab-separated-values", @@ -181,7 +176,8 @@ function checkMimeTypeIfOkToMakeNew(mimeType) { "image/svg+xml", "application/vnd.openxmlformats-officedocument.presentationml.presentation", "application/vnd.oasis.opendocument.presentation", - "application/vnd.google-apps.document" + "application/vnd.google-apps.document", + "application/vnd.google-apps.spreadsheet" ]; if (mimeTypesToTouch.includes(mimeType)) { diff --git "a/Google-drive-migrering/Steg2-tvingad-\303\244ndring-fil\303\244gare/README.md" "b/Google-drive-migrering/Steg2-tvingad-\303\244ndring-fil\303\244gare/README.md" new file mode 100644 index 0000000..a01b0ed --- /dev/null +++ "b/Google-drive-migrering/Steg2-tvingad-\303\244ndring-fil\303\244gare/README.md" @@ -0,0 +1,53 @@ +# Skript för admin i kåren för att tvinga ändring av filägare +Dessa skript gör olika saker och hjälper till med +- Få fram lista över vilka som är ägare till alla filer och undermappar till en given mapp. +- Ta bort länkdelning och redigerare för alla filer och undermappar till en given mapp. De enda som är kvar är fil/mapp-ägaren och du själv. +- Skapa filer som du själv äger som är kopior av orginalen och tar bort orginalfilen för dig så att du kan flytta över filerna. + +## Inställningar - gemensamt +1. Besök i första hand när du är inloggad på kårens webbansvariges Google-konto eller annat lämpligt Google-konto med hög behörighet på kårens Google Workspace den mapp på Google drive där du vill lagra projektet. Där skapar du en ny fil på formatet Google Apps Script. Om det inte finns att välja på ska du besöka script.google.com när du är inloggad och trycka på "Nytt Script" och namnge sedan projektet till något lämpligt, t.ex Byta ägare. Om du ska dela skriptet för olika mappar till olika personer är det lämpligt att skriva i projektnamnet också vilken mapp det är frågan om. +1. Till vänster på skärmen listas de olika filer som finns i projektet och nu vid starten finns endast en som heter `Code.gs`. Byt namn på den till `ListaÄgare` och ta bort den kod som står i filen. +1. Klistra in koden från filen ListaÄgare.gs och spara (Ctrl+S). +1. Skapa också nya filer för `ÄndraDelning` och `KopiaNyÄgare` och klistra in respektive kod där för att sen spara. +### Inställningar - ListaÄgare +- Vilket id som Google drive-mappen har. Hittas som enligt exemplet i koden som den sista delen i webbadressen när du besöker Google drive-mappen. + - ``` + var folderId = "qwer-asdfghjklzxcvbnmqwertyuio"; + ``` + +### Inställningar - ÄndraDelning +- Styr till vilket Google-konto som skriptet ska göra så att enbart du och fil- eller mappägaren har tillgång till filerna och mapparna. + - ``` + var emailOfAdmin = "webmaster@dinegnascoutkår.se"; + ``` +- Vilken domän som Google-kontot tillhör som skriptet försöker överföra ägarskapet till. Som en liten extra koll att du fyller i rätt e-postadress. + - ``` + var domain = "dinegnascoutkår.se"; + ``` +- Vilket id som Google drive-mappen har. Hittas som enligt exemplet i koden som den sista delen i webbadressen när du besöker Google drive-mappen. + - ``` + var folderId = "qwer-asdfghjklzxcvbnmqwertyuio"; + ``` + +### Inställningar - KopiaNyÄgare +- Vilket id som Google drive-mappen har. Hittas som enligt exemplet i koden som den sista delen i webbadressen när du besöker Google drive-mappen. + - ``` + var folderId = "qwer-asdfghjklzxcvbnmqwertyuio"; + ``` + +## Skript +### ListaÄgare +Detta skript generera en lista över alla fil- och undermappsägare till en given mapp. Resultatet skrivs ut i loggen det sista den gör. + +### ÄndraDelning +Detta skript tar bort eventuell länkdelning för alla filer och undermappar till en given mapp samt ändrar delningen så att enbart fil- eller mappägaren, du själv samt det Google-konto som är specificerat i `emailOfAdmin` har tillgång till den. + +För de eventuella mappar och filer som det inte går att ta bort länkdelning på skrivs de ut i loggen det sista den gör. Vanligtvis är detta med anledning av att det finns flera olika behörigheter för länkdelning för de inom organisationen (kårens konton) och för övriga. Då dessa behörigheter kan fortgå till undermappar osv. kan du börja med att manuellt gå in i den första mappen som listas i loggen och ta bort länkdelningen inom kåren för den för att sen köra skriptet igen. + +### KopiaNyÄgare +Detta skript skapar en kopia på filer som du inte äger. Därefter tas datan bort ur orginalfilen för att sedan ta bort din egen åtkomst till orginalfilen. Till slut tas behörigheten bort för ägaren till orginalfilen från kopian då denne automatiskt ges behörighet vid skapandet av kopian. + +Observera att programmet endast gör detta för vissa typer av filer som är specificerade i funktionen `checkMimeTypeIfOkToMakeNew`. Om du vill att skriptet ska göra det för att typer av filformat kan du ta bort `//` på första raden i funktionen `checkMimeTypeIfOkToMakeNew`. +T.ex görs inte detta för filtypen med Google formulär då man av misstag då kan ta bort dem och få dem att sluta fungera. + +Förslagsvis körs skriptet `ÄndraDelning` igen efter att detta skript har körts då det kan hända att de nyskapade filerna har fått oönskade behörighetstilldelningar. From 4f56f209655e0d82826a24f14f11f7578a2de632 Mon Sep 17 00:00:00 2001 From: Emil Date: Wed, 23 Dec 2020 22:42:34 +0100 Subject: [PATCH 08/23] =?UTF-8?q?La=20till=20skript=20f=C3=B6r=20att=20fly?= =?UTF-8?q?tta=20filer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Google-drive-migrering/README.md | 27 ++- .../Steg1-ge-bort-\303\244garskap/README.md" | 10 +- .../KopiaNy\303\204gare.gs" | 4 +- .../README.md" | 6 +- .../Steg3-flytta-filer/FlyttaFiler.gs | 156 ++++++++++++++++++ .../Steg3-flytta-filer/README.md | 37 +++++ .../Steg3-flytta-filer/RaderaTommaMappar.gs | 92 +++++++++++ README.md | 3 +- 8 files changed, 315 insertions(+), 20 deletions(-) create mode 100644 Google-drive-migrering/Steg3-flytta-filer/FlyttaFiler.gs create mode 100644 Google-drive-migrering/Steg3-flytta-filer/README.md create mode 100644 Google-drive-migrering/Steg3-flytta-filer/RaderaTommaMappar.gs diff --git a/Google-drive-migrering/README.md b/Google-drive-migrering/README.md index 4bb0344..1ff97f4 100644 --- a/Google-drive-migrering/README.md +++ b/Google-drive-migrering/README.md @@ -19,22 +19,28 @@ ta bort filen helt och hållet, så filen kommer finnas kvar och eventuellt kunn Skripten hjälper till med detta arbete vilket kan vara omständigt om det görs manuellt. ## Skript -### Ge bort ditt ägarskap för filer och mappar +### Steg 1 - Ge bort ägarskap +#### Ge bort ditt ägarskap för filer och mappar Skript för att dela med användare i kåren som har tillgång till en given mapp och undermappar för att flytta deras ägarskap till dig eller given e-postadress. -Tips är att köra skriptet om att lista vilka som äger filer och undermappar före du delar detta med kårens funktionärer för att veta vilka du ska skicka -skriptet till. - -### Lista vilka som äger filer och undermappar i en mapp +### Steg 2 - Tvingad ändring av filägare +#### Lista vilka som äger filer och undermappar i en mapp Skript för att få fram vilka som äger alla filer och undermappar till en given mapp. -### Ta bort länkdelning och redigerare för filer och undermappar i en mapp +#### Ta bort länkdelning och redigerare för filer och undermappar i en mapp Skript som tar bort länkdelning och redigerare för alla filer och undermappar till en given mapp. De enda som är kvar är fil/mapp-ägaren och du själv. -### Skapa nya filer som du själv äger +#### Skapa nya filer som du själv äger Skript som skapar filer som du själv äger som är kopior och tar bort orginalfilen för dig. Skriver också över orginalfilen med ny data. +### Steg 3 - Flytta filer +#### Radera tomma mappar +Skript som raderar tomma mappar. + +#### Flytta filer +Skript som flyttar dina filer och kopierar över mappar. + ## Förslag till utförandesteg 1. Ladda ner en kopia från Google drive för den mappen du vill flytta för att ha som säkerhetskopia. 1. Sätt upp alla skripten enligt instruktionerna. @@ -42,6 +48,9 @@ Skript som skapar filer som du själv äger som är kopior och tar bort orginalf 1. Skicka ett mejl och dela skriptet `BytaÄgare` enligt instruktionen till de det berör. Du kommer få massor av e-brev när någon kör skriptet så att du vet. Se också till att de du skickar skriptet till har e-postkonto på samma domän som de ska överföra ägarskapet till. 1. Nu är förhoppningsvis allt överfört till dig om alla har kört skriptet. Kör skriptet `ListaÄgare` för att se om det nu bara är du som är listad som ägare. 1. När du är nöjd; kör skriptet `ÄndraDelning` för att se till så att inte alla längre har tillgång till alla filer. Det kan behövas lite manuellt arbete med ändring av behörighetsdelning efter körningen om inte programmet lyckas ändra på alla ställen. -1. Kör skriptet `KopiaNyÄgare` för att skapa kopior på de filer som du ej äger så att du nu äger de nya filerna. Orginalfilerna skrivs över och raderas htl för alla förutom orginalägaren. +1. Kör skriptet `KopiaNyÄgare` för att skapa kopior på de filer som du ej äger så att du nu äger de nya filerna. Orginalfilerna skrivs över och raderas för alla förutom orginalägaren. 1. Kör skriptet `ÄndraDelning` igen då det kan ha blivit problem med att ta bort behörigheten för ägaren till orginalfilerna från kopian. -1. Börja flytta över alla filer till den delade enheten. Mapparna får du skapa på nytt på den delade enheten och de gamla mapparna ska raderas. +1. Kör skriptet `RaderaTommaMappar` för att radera alla tomma undermappar till den mapp du ska flytta filerna ifrån. +1. Kör skriptet `FlyttaFiler` för att flytta över dina egna filer till den delade enheten samt få med alla mappar. +1. Kör skriptet `RaderaTommaMappar` igen för att radera alla tomma undermappar till den mapp du har flyttat filerna ifrån. Detta då det antagligen har blivit en hel del tomma mappar nu. +1. Manuellt flytta över på lämpligt sätt de filer som är kvar att flytta samt radera mappar. diff --git "a/Google-drive-migrering/Steg1-ge-bort-\303\244garskap/README.md" "b/Google-drive-migrering/Steg1-ge-bort-\303\244garskap/README.md" index ab7c0cc..1c27ab1 100644 --- "a/Google-drive-migrering/Steg1-ge-bort-\303\244garskap/README.md" +++ "b/Google-drive-migrering/Steg1-ge-bort-\303\244garskap/README.md" @@ -20,9 +20,9 @@ e-postadresser för vem den nya ägaren ska vara för att detta skript ska komma på kårens domän och det andra som ändrar till ditt privata @gmail.com konto. ## Inställningar -1. Besök i första hand när du är inloggad på kårens webbansvariges Google-konto eller annat lämpligt Google-konto med hög behörighet på kårens Google Workspace den mapp på Google drive där du vill lagra projektet. Där skapar du en ny fil på formatet Google Apps Script. Om det inte finns att välja på ska du besöka script.google.com när du är inloggad och trycka på "Nytt Script" och namnge sedan projektet till något lämpligt, t.ex Byta ägare. Om du ska dela skriptet för olika mappar till olika personer är det lämpligt att skriva i projektnamnet också vilken mapp det är frågan om. -1. Till vänster på skärmen listas de olika filer som finns i projektet och nu vid starten finns endast en som heter Code.gs. Byt namn på den till "BytaÄgare" och ta bort den koden som står i filen. -1. Klistra in koden från filen BytaÄgare.gs och spara (Ctrl+S). +1. Besök när du är inloggad på kårens webbansvariges Google-konto eller annat lämpligt Google-konto med hög behörighet på kårens Google Workspace den mapp på Google drive där du vill lagra projektet. Där skapar du en ny fil på formatet `Google Apps Script`. Om du ska dela skriptet för olika mappar till olika personer är det lämpligt att skriva i projektnamnet också vilken mapp det är frågan om. +1. Till vänster på skärmen listas de olika filer som finns i projektet och nu vid starten finns endast en som heter Code.gs. Byt namn på den till `BytaÄgare` och ta bort den koden som står i filen. +1. Klistra in koden från filen `BytaÄgare.gs` och spara (Ctrl+S). 1. Ändra följande variabler i koden - Styr till vilket Google-konto som skriptet ska försöka överföra ägarskapet till. - ``` @@ -37,6 +37,6 @@ på kårens domän och det andra som ändrar till ditt privata @gmail.com konto. var folderId = "qwer-asdfghjklzxcvbnmqwertyuio"; ``` 1. Ta reda på vilka du ska skicka skriptet till. -2. Ändra delningsinställningarna för skriptet via inställningarna uppe till höger. Förslagsvis så att andra enbart kan visa skriptet och inte ändra. -3. Dela länken till skriptet och be dem köra det genom att trycka på `Run`. +1. Ändra delningsinställningarna för skriptet via inställningarna uppe till höger. Förslagsvis så att andra enbart kan visa skriptet och inte ändra. +1. Dela länken till skriptet och be dem köra det genom att trycka på `Run`. - Observera att du kommer att få ett mejl till din inkorg för alla filer som skriptet påverkar när någon kör det, så det rekommenderas att vara beredd på det. diff --git "a/Google-drive-migrering/Steg2-tvingad-\303\244ndring-fil\303\244gare/KopiaNy\303\204gare.gs" "b/Google-drive-migrering/Steg2-tvingad-\303\244ndring-fil\303\244gare/KopiaNy\303\204gare.gs" index 14b7794..b0b8597 100644 --- "a/Google-drive-migrering/Steg2-tvingad-\303\244ndring-fil\303\244gare/KopiaNy\303\204gare.gs" +++ "b/Google-drive-migrering/Steg2-tvingad-\303\244ndring-fil\303\244gare/KopiaNy\303\204gare.gs" @@ -155,8 +155,8 @@ function checkMimeTypeIfOkToMakeNew(mimeType) { //return true; - //Listan över de att välja över hittas på - //https://developers.google.com/drive/api/v3/ref-export-formats + //Listan över de att välja över hittas på + //https://developers.google.com/drive/api/v3/ref-export-formats var mimeTypesToTouch = [ "text/plain", diff --git "a/Google-drive-migrering/Steg2-tvingad-\303\244ndring-fil\303\244gare/README.md" "b/Google-drive-migrering/Steg2-tvingad-\303\244ndring-fil\303\244gare/README.md" index a01b0ed..9bcb20f 100644 --- "a/Google-drive-migrering/Steg2-tvingad-\303\244ndring-fil\303\244gare/README.md" +++ "b/Google-drive-migrering/Steg2-tvingad-\303\244ndring-fil\303\244gare/README.md" @@ -5,9 +5,9 @@ Dessa skript gör olika saker och hjälper till med - Skapa filer som du själv äger som är kopior av orginalen och tar bort orginalfilen för dig så att du kan flytta över filerna. ## Inställningar - gemensamt -1. Besök i första hand när du är inloggad på kårens webbansvariges Google-konto eller annat lämpligt Google-konto med hög behörighet på kårens Google Workspace den mapp på Google drive där du vill lagra projektet. Där skapar du en ny fil på formatet Google Apps Script. Om det inte finns att välja på ska du besöka script.google.com när du är inloggad och trycka på "Nytt Script" och namnge sedan projektet till något lämpligt, t.ex Byta ägare. Om du ska dela skriptet för olika mappar till olika personer är det lämpligt att skriva i projektnamnet också vilken mapp det är frågan om. +1. Besök när du är inloggad på kårens webbansvariges Google-konto eller annat lämpligt Google-konto med hög behörighet på kårens Google Workspace den mapp på Google drive där du vill lagra projektet. Där skapar du en ny fil på formatet `Google Apps Script`. 1. Till vänster på skärmen listas de olika filer som finns i projektet och nu vid starten finns endast en som heter `Code.gs`. Byt namn på den till `ListaÄgare` och ta bort den kod som står i filen. -1. Klistra in koden från filen ListaÄgare.gs och spara (Ctrl+S). +1. Klistra in koden från filen `ListaÄgare.gs` och spara (Ctrl+S). 1. Skapa också nya filer för `ÄndraDelning` och `KopiaNyÄgare` och klistra in respektive kod där för att sen spara. ### Inställningar - ListaÄgare - Vilket id som Google drive-mappen har. Hittas som enligt exemplet i koden som den sista delen i webbadressen när du besöker Google drive-mappen. @@ -39,6 +39,8 @@ Dessa skript gör olika saker och hjälper till med ### ListaÄgare Detta skript generera en lista över alla fil- och undermappsägare till en given mapp. Resultatet skrivs ut i loggen det sista den gör. +Om du enbart vill att skriptet ska visa vilka som äger filerna lägger du till `//` framför raden `listOfOwners.push(oldChildFolderOwner);` innan du kör skriptet. + ### ÄndraDelning Detta skript tar bort eventuell länkdelning för alla filer och undermappar till en given mapp samt ändrar delningen så att enbart fil- eller mappägaren, du själv samt det Google-konto som är specificerat i `emailOfAdmin` har tillgång till den. diff --git a/Google-drive-migrering/Steg3-flytta-filer/FlyttaFiler.gs b/Google-drive-migrering/Steg3-flytta-filer/FlyttaFiler.gs new file mode 100644 index 0000000..a21687a --- /dev/null +++ b/Google-drive-migrering/Steg3-flytta-filer/FlyttaFiler.gs @@ -0,0 +1,156 @@ +/** + * @author Emil Öhman + * @website https://github.com/Scouterna + */ + + +/** + * Funktion för att flytta dina filer och kopiera mappar + */ +function moveFiles() { + + //Hämta mappen vi ska leta filer i + //T.ex https://drive.google.com/drive/u/0/folders/qwer-asdfghjklzxcvbnmqwertyuio + var sourceFolderId = "qwer-asdfghjklzxcvbnmqwertyuio"; + + var destFolderId = "oiuytrewqlkjhgfdsamnbvcxz"; + + + //Din e-postadress för att veta vilka filer/mappar vi kan ändra ägare på + var yourEmail = Session.getActiveUser().getEmail(); + Logger.log("Din e-post " + yourEmail); + + //Anropar functionen som ska flytta på alla dina egna filer + moveFilesAndCopyFolders(sourceFolderId, destFolderId, yourEmail); +} + + +/** + * Rekursiv funktion för att flytta dina filer och kopiera mappar + * + * @param {string} sourceFolderId - Id för en Google-mapp att flytta från + * @param {string} destFolderId - Id för en Google-mapp att flytta till + * @param {string} yourEmail - Din e-postadress som kör skriptet + */ +function moveFilesAndCopyFolders(sourceFolderId, destFolderId, yourEmail) { + + //Hämta mappen vi ska leta filer i + var sourceFolder = DriveApp.getFolderById(sourceFolderId); + + var destFolder = DriveApp.getFolderById(destFolderId); + + if (!sourceFolder || !destFolder) { + Logger.log("Du kör fel funktion!!"); + return; + } + + //Hämta alla filer som finns i denna mapp + var sourceFiles = sourceFolder.getFiles(); + + while(sourceFiles.hasNext()) { + try { + //Kollar nästa fil + var sourceFile = sourceFiles.next(); + + var mimeType = sourceFile.getMimeType(); + + //Vad filen heter + var sourceFileName = sourceFile.getName(); + + //Vem som äger sourceFilen innan + var sourceFileOwner = sourceFile.getOwner().getEmail(); + + if (sourceFileOwner == yourEmail) { + Logger.log("Du äger denna fil " + sourceFileName); + if (checkMimeTypeIfOkToMakeNew(mimeType)) { + try { + //Flytta denna fil om det går + sourceFile.moveTo(destFolder); + Logger.log("Filen " + sourceFileName + " är nu flyttad"); + } + catch (e) { + Logger.log(e.message); + } + } + } + else { + Logger.log("Du äger EJ denna fil " + sourceFileName); + } + } + catch(e) { + Logger.log("Problem med fil: " + e); + } + } + + //Hämta alla undermappar som finns i denna mapp + var sourceChildFolders = sourceFolder.getFolders(); + + while(sourceChildFolders.hasNext()) { + try { + //Kollar nästa mapp + var sourceChildFolder = sourceChildFolders.next(); + + //Vad mappen heter + var sourceChildName = sourceChildFolder.getName(); + + //Vilket id som mappen har + var sourceChildId = sourceChildFolder.getId(); + + try { + //Skapa en ny mapp på rätt plats + var destChild = destFolder.createFolder(sourceChildName); + destChildId = destChild.getId(); + moveFilesAndCopyFolders(sourceChildId, destChildId, yourEmail); + } + catch(e) { + Logger.log("Problem med mapp: " + e); + } + } + catch(e) { + Logger.log("Problem med mapp: " + e); + } + } +} + + +/** + * Funktion för att kontrollera om filtypen är ok att röra + * + * @param {string} mimeType - Sträng för en mimetype + * + * @returns {boolean} + */ +function checkMimeTypeIfOkToMakeNew(mimeType) { + + //return true; + + //Listan över de att välja över hittas på + //https://developers.google.com/drive/api/v3/ref-export-formats + + var mimeTypesToTouch = [ + "text/plain", + "application/rtf", + "application/vnd.oasis.opendocument.text", + "application/pdf", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "application/msword", + "application/vnd.ms-excel", + "application/vnd.ms-powerpoint", + "application/x-vnd.oasis.opendocument.spreadsheet", + "text/csv", + "text/tab-separated-values", + "image/jpeg", + "image/png", + "image/svg+xml", + "application/vnd.openxmlformats-officedocument.presentationml.presentation", + "application/vnd.oasis.opendocument.presentation", + "application/vnd.google-apps.document", + "application/vnd.google-apps.spreadsheet" + ]; + + if (mimeTypesToTouch.includes(mimeType)) { + return true; + } + return false; +} diff --git a/Google-drive-migrering/Steg3-flytta-filer/README.md b/Google-drive-migrering/Steg3-flytta-filer/README.md new file mode 100644 index 0000000..750018e --- /dev/null +++ b/Google-drive-migrering/Steg3-flytta-filer/README.md @@ -0,0 +1,37 @@ +# Skript för admin i kåren för att flytta filer till delade enheter +Dessa skript hjälper till med följande saker: +- Radera tomma mappar. +- Flytta dina filer och kopia över undermappar till en given mapp. + +## Inställningar - gemensamt +1. Besök när du är inloggad på kårens webbansvariges Google-konto eller annat lämpligt Google-konto med hög behörighet på kårens Google Workspace den mapp på Google drive där du vill lagra projektet. Där skapar du en ny fil på formatet `Google Apps Script`. +1. Till vänster på skärmen listas de olika filer som finns i projektet och nu vid starten finns endast en som heter `Code.gs`. Byt namn på den till `RaderaTommaMappar` och ta bort den kod som står i filen. +1. Klistra in koden från filen `RaderaTommaMappar.gs` och spara (Ctrl+S). +1. Skapa också en ny fil för `FlyttaFiler` och klistra in motsvarande kod där för att sen spara. + +### Inställningar - RaderaTommaMappar +- Vilket id som Google drive-mappen har. Hittas som enligt exemplet i koden som den sista delen i webbadressen när du besöker Google drive-mappen. + - ``` + var folderId = "qwer-asdfghjklzxcvbnmqwertyuio"; + ``` +### Inställningar - FlyttaFiler +- Vilket id som Google drive-mappen har där filerna ska flyttas ifrån. Hittas som enligt exemplet i koden som den sista delen i webbadressen när du besöker Google drive-mappen. + - ``` + var sourceFolderId = "qwer-asdfghjklzxcvbnmqwertyuio"; + ``` +- Vilket id som Google drive-mappen har dit filerna ska flyttas. Hittas som enligt exemplet i koden som den sista delen i webbadressen när du besöker Google drive-mappen. + - ``` + var destFolderId = "qwer-asdfghjklzxcvbnmqwertyuio"; + ``` + +## Skript +### RaderaTommaMappar +Detta skript försöker radera tomma undermappar till en given mapp. + +### FlyttaFiler +Detta skript flyttar dina egna filer och kopiera undermappar från en given destination till en given målmapp. + +Observera att programmet endast gör detta för vissa typer av filer som är specificerade i funktionen `checkMimeTypeIfOkToMakeNew`. Om du vill att skriptet ska göra det för att typer av filformat kan du ta bort `//` på första raden i funktionen `checkMimeTypeIfOkToMakeNew`. +T.ex görs inte detta för filtypen med Google formulär då man av misstag då kan ta bort dem och få dem att sluta fungera. + +Förslagsvis körs skriptet `RaderaTommaMappar` igen efter att detta skript har körts då det kan hända att det blivit en del tomma mappar efter att dina filer har flyttats till den delade enheten. diff --git a/Google-drive-migrering/Steg3-flytta-filer/RaderaTommaMappar.gs b/Google-drive-migrering/Steg3-flytta-filer/RaderaTommaMappar.gs new file mode 100644 index 0000000..055f714 --- /dev/null +++ b/Google-drive-migrering/Steg3-flytta-filer/RaderaTommaMappar.gs @@ -0,0 +1,92 @@ +/** + * @author Emil Öhman + * @website https://github.com/Scouterna + */ + + +/** + * Funktion för att radera tomma undermappar till en mapp + */ +function removeEmptyFolders() { + + //Mappen vi ska leta filer i + //T.ex https://drive.google.com/drive/u/0/folders/qwer-asdfghjklzxcvbnmqwertyuio + var folderId = "qwer-asdfghjklzxcvbnmqwertyuio"; + + //Din e-postadress för att veta vilka filer/mappar vi kan ändra ägare på + var yourEmail = Session.getActiveUser().getEmail(); + Logger.log("Din e-post " + yourEmail); + + //Anropar functionen som ska byta ägare på alla filer + searchForEmptyFoldersToRemove(folderId, yourEmail); +} + + +/** + * Rekursiv funktion för att söka igenom filer i aktuell mapp + * och sen ta en titt i nästa mapp osv. + * + * @param {string} folderId - Id för en Google-mapp + * @param {string} yourEmail - Din e-postadress som kör skriptet + */ +function searchForEmptyFoldersToRemove(folderId, yourEmail) { + + //Hämta mappen vi ska leta filer i + var folder = DriveApp.getFolderById(folderId); + + if (!folder) { + Logger.log("Du kör fel funktion!!"); + return; + } + + //Hämta alla filer som finns i denna mapp + var files = folder.getFiles(); + + //Hämta alla undermappar som finns i denna mapp + var childFolders = folder.getFolders(); + + var hasChildFolder = false; + while (childFolders.hasNext()) { + try { + hasChildFolder = true; + //Kollar nästa mapp + var childFolder = childFolders.next(); + + //Vilket id som mappen har + var childId = childFolder.getId(); + + searchForEmptyFoldersToRemove(childId, yourEmail); + } + catch (e) { + Logger.log("Problem med mapp: " + e); + } + } + + if (!hasChildFolder && !files.hasNext()) { + + var owner = folder.getOwner().getEmail(); + + if (owner == yourEmail) { + Logger.log("Tom mapp som du äger " + folder.getName()); + try { + Logger.log("Försöker radera mappen"); + folder.setTrashed(true); + Logger.log("Lyckades radera mappen"); + } + catch (e) { + Logger.log("Problem med mapp: " + e); + } + } + else { + Logger.log("Tom mapp som du inte äger " + folder.getName()); + try { + Logger.log("Försöker ta bort mappen från din drive"); + folder.revokePermissions(yourEmail); + Logger.log("Lyckades ta bort mappen från din drive"); + } + catch (e) { + Logger.log("Problem med mapp: " + e); + } + } + } +} diff --git a/README.md b/README.md index 3c27597..0fa8423 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,7 @@ lägg ett ärende under "Issues" eller mejla emil.ohman@scouterna.se. I bland kommer det ny funktionalitet, så håll utkik på en ny version genom att trycka på knappen **Watch** uppe till höger på sidan för att du kunna bli notifierad vid en ny version. -Du kan ladda ner den senaste versionen [här] -(https://github.com/Scouterna/Google-Scoutnet-synk/releases/latest) och där kan +Du kan ladda ner den senaste versionen [här](https://github.com/Scouterna/Google-Scoutnet-synk/releases/latest) och där kan du också ser vilken funktionalitet som är ny i respektive version. Läs filen README.md för instruktion om installation och funktionalitet. From ad0ca5a781d00e4bf2074cbd885ab1b72770bf38 Mon Sep 17 00:00:00 2001 From: Emil Date: Fri, 25 Dec 2020 19:26:41 +0100 Subject: [PATCH 09/23] =?UTF-8?q?Fler=20l=C3=A4nkar=20i=20Readme=20f=C3=B6?= =?UTF-8?q?r=20migreringsskript?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Google-drive-migrering/README.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Google-drive-migrering/README.md b/Google-drive-migrering/README.md index 1ff97f4..6d2f7f7 100644 --- a/Google-drive-migrering/README.md +++ b/Google-drive-migrering/README.md @@ -19,12 +19,12 @@ ta bort filen helt och hållet, så filen kommer finnas kvar och eventuellt kunn Skripten hjälper till med detta arbete vilket kan vara omständigt om det görs manuellt. ## Skript -### Steg 1 - Ge bort ägarskap +### [Steg 1 - Ge bort ägarskap](Steg1-ge-bort-ägarskap) #### Ge bort ditt ägarskap för filer och mappar Skript för att dela med användare i kåren som har tillgång till en given mapp och undermappar för att flytta deras ägarskap till dig eller given e-postadress. -### Steg 2 - Tvingad ändring av filägare +### [Steg 2 - Tvingad ändring av filägare](Steg2-tvingad-ändring-filägare) #### Lista vilka som äger filer och undermappar i en mapp Skript för att få fram vilka som äger alla filer och undermappar till en given mapp. @@ -34,7 +34,7 @@ Skript som tar bort länkdelning och redigerare för alla filer och undermappar #### Skapa nya filer som du själv äger Skript som skapar filer som du själv äger som är kopior och tar bort orginalfilen för dig. Skriver också över orginalfilen med ny data. -### Steg 3 - Flytta filer +### [Steg 3 - Flytta filer](Steg3-flytta-filer) #### Radera tomma mappar Skript som raderar tomma mappar. @@ -44,13 +44,13 @@ Skript som flyttar dina filer och kopierar över mappar. ## Förslag till utförandesteg 1. Ladda ner en kopia från Google drive för den mappen du vill flytta för att ha som säkerhetskopia. 1. Sätt upp alla skripten enligt instruktionerna. -1. Kör skriptet `ListaÄgare` för att få fram e-postadresser på vilka som äger alla filer och undermappar. -1. Skicka ett mejl och dela skriptet `BytaÄgare` enligt instruktionen till de det berör. Du kommer få massor av e-brev när någon kör skriptet så att du vet. Se också till att de du skickar skriptet till har e-postkonto på samma domän som de ska överföra ägarskapet till. -1. Nu är förhoppningsvis allt överfört till dig om alla har kört skriptet. Kör skriptet `ListaÄgare` för att se om det nu bara är du som är listad som ägare. -1. När du är nöjd; kör skriptet `ÄndraDelning` för att se till så att inte alla längre har tillgång till alla filer. Det kan behövas lite manuellt arbete med ändring av behörighetsdelning efter körningen om inte programmet lyckas ändra på alla ställen. -1. Kör skriptet `KopiaNyÄgare` för att skapa kopior på de filer som du ej äger så att du nu äger de nya filerna. Orginalfilerna skrivs över och raderas för alla förutom orginalägaren. -1. Kör skriptet `ÄndraDelning` igen då det kan ha blivit problem med att ta bort behörigheten för ägaren till orginalfilerna från kopian. -1. Kör skriptet `RaderaTommaMappar` för att radera alla tomma undermappar till den mapp du ska flytta filerna ifrån. -1. Kör skriptet `FlyttaFiler` för att flytta över dina egna filer till den delade enheten samt få med alla mappar. -1. Kör skriptet `RaderaTommaMappar` igen för att radera alla tomma undermappar till den mapp du har flyttat filerna ifrån. Detta då det antagligen har blivit en hel del tomma mappar nu. +1. Kör skriptet [`ListaÄgare`](Steg2-tvingad-ändring-filägare) för att få fram e-postadresser på vilka som äger alla filer och undermappar. +1. Skicka ett mejl och dela skriptet [`BytaÄgare`](Steg1-ge-bort-ägarskap) enligt instruktionen till de det berör. Du kommer få massor av e-brev när någon kör skriptet så att du vet. Se också till att de du skickar skriptet till har e-postkonto på samma domän som de ska överföra ägarskapet till. +1. Nu är förhoppningsvis allt överfört till dig om alla har kört skriptet. Kör skriptet [`ListaÄgare`](Steg2-tvingad-ändring-filägare) för att se om det nu bara är du som är listad som ägare. +1. När du är nöjd; kör skriptet [`ÄndraDelning`](Steg2-tvingad-ändring-filägare) för att se till så att inte alla längre har tillgång till alla filer. Det kan behövas lite manuellt arbete med ändring av behörighetsdelning efter körningen om inte programmet lyckas ändra på alla ställen. +1. Kör skriptet [`KopiaNyÄgare`](Steg2-tvingad-ändring-filägare) för att skapa kopior på de filer som du ej äger så att du nu äger de nya filerna. Orginalfilerna skrivs över och raderas för alla förutom orginalägaren. +1. Kör skriptet [`ÄndraDelning`](Steg2-tvingad-ändring-filägare) igen då det kan ha blivit problem med att ta bort behörigheten för ägaren till orginalfilerna från kopian. +1. Kör skriptet [`RaderaTommaMappar`](Steg3-flytta-filer) för att radera alla tomma undermappar till den mapp du ska flytta filerna ifrån. +1. Kör skriptet [`FlyttaFiler`](Steg3-flytta-filer) för att flytta över dina egna filer till den delade enheten samt få med alla mappar. +1. Kör skriptet [`RaderaTommaMappar`](Steg3-flytta-filer) igen för att radera alla tomma undermappar till den mapp du har flyttat filerna ifrån. Detta då det antagligen har blivit en hel del tomma mappar nu. 1. Manuellt flytta över på lämpligt sätt de filer som är kvar att flytta samt radera mappar. From 0128a1fd877c8979a97889e37e74e38a7b6fe2d6 Mon Sep 17 00:00:00 2001 From: Emil Date: Fri, 25 Dec 2020 20:00:21 +0100 Subject: [PATCH 10/23] =?UTF-8?q?=C3=84ndrat=20textformatering=20i=20Readm?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Steg1-ge-bort-\303\244garskap/README.md" | 6 +- .../Steg3-flytta-filer/README.md | 2 +- README.md | 60 +++++++++---------- 3 files changed, 34 insertions(+), 34 deletions(-) diff --git "a/Google-drive-migrering/Steg1-ge-bort-\303\244garskap/README.md" "b/Google-drive-migrering/Steg1-ge-bort-\303\244garskap/README.md" index 1c27ab1..6ea8e23 100644 --- "a/Google-drive-migrering/Steg1-ge-bort-\303\244garskap/README.md" +++ "b/Google-drive-migrering/Steg1-ge-bort-\303\244garskap/README.md" @@ -20,8 +20,8 @@ e-postadresser för vem den nya ägaren ska vara för att detta skript ska komma på kårens domän och det andra som ändrar till ditt privata @gmail.com konto. ## Inställningar -1. Besök när du är inloggad på kårens webbansvariges Google-konto eller annat lämpligt Google-konto med hög behörighet på kårens Google Workspace den mapp på Google drive där du vill lagra projektet. Där skapar du en ny fil på formatet `Google Apps Script`. Om du ska dela skriptet för olika mappar till olika personer är det lämpligt att skriva i projektnamnet också vilken mapp det är frågan om. -1. Till vänster på skärmen listas de olika filer som finns i projektet och nu vid starten finns endast en som heter Code.gs. Byt namn på den till `BytaÄgare` och ta bort den koden som står i filen. +1. Besök när du är inloggad på kårens webbansvariges Google-konto eller annat lämpligt Google-konto med hög behörighet på kårens Google Workspace den mapp på Google drive där du vill lagra projektet. Där skapar du en ny fil på formatet **Google Apps Script**. Om du ska dela skriptet för olika mappar till olika personer är det lämpligt att skriva i projektnamnet också vilken mapp det är frågan om. +1. Till vänster på skärmen listas de olika filer som finns i projektet och nu vid starten finns endast en som heter `Code.gs`. Byt namn på den till `BytaÄgare` och ta bort den koden som står i filen. 1. Klistra in koden från filen `BytaÄgare.gs` och spara (Ctrl+S). 1. Ändra följande variabler i koden - Styr till vilket Google-konto som skriptet ska försöka överföra ägarskapet till. @@ -38,5 +38,5 @@ på kårens domän och det andra som ändrar till ditt privata @gmail.com konto. ``` 1. Ta reda på vilka du ska skicka skriptet till. 1. Ändra delningsinställningarna för skriptet via inställningarna uppe till höger. Förslagsvis så att andra enbart kan visa skriptet och inte ändra. -1. Dela länken till skriptet och be dem köra det genom att trycka på `Run`. +1. Dela länken till skriptet och be dem köra det genom att trycka på **Run**. - Observera att du kommer att få ett mejl till din inkorg för alla filer som skriptet påverkar när någon kör det, så det rekommenderas att vara beredd på det. diff --git a/Google-drive-migrering/Steg3-flytta-filer/README.md b/Google-drive-migrering/Steg3-flytta-filer/README.md index 750018e..23d3ac5 100644 --- a/Google-drive-migrering/Steg3-flytta-filer/README.md +++ b/Google-drive-migrering/Steg3-flytta-filer/README.md @@ -4,7 +4,7 @@ Dessa skript hjälper till med följande saker: - Flytta dina filer och kopia över undermappar till en given mapp. ## Inställningar - gemensamt -1. Besök när du är inloggad på kårens webbansvariges Google-konto eller annat lämpligt Google-konto med hög behörighet på kårens Google Workspace den mapp på Google drive där du vill lagra projektet. Där skapar du en ny fil på formatet `Google Apps Script`. +1. Besök när du är inloggad på kårens webbansvariges Google-konto eller annat lämpligt Google-konto med hög behörighet på kårens Google Workspace den mapp på Google drive där du vill lagra projektet. Där skapar du en ny fil på formatet **Google Apps Script**. 1. Till vänster på skärmen listas de olika filer som finns i projektet och nu vid starten finns endast en som heter `Code.gs`. Byt namn på den till `RaderaTommaMappar` och ta bort den kod som står i filen. 1. Klistra in koden från filen `RaderaTommaMappar.gs` och spara (Ctrl+S). 1. Skapa också en ny fil för `FlyttaFiler` och klistra in motsvarande kod där för att sen spara. diff --git a/README.md b/README.md index 0fa8423..f667b51 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,8 @@ Du kan med dessa program synkronisera Google-användarkonton hos kåren med pers samt synkronisera google-grupper med e-postlistor i Scoutnet. Du kan använda dessa som e-postlistor eller som att lägga till att en specifik -google-grupp ger behörighet till en specifik "Delad enhet". Alltså automatisk synkronisering att -t.ex Spårarledare ges behörighet till en "Delad enhet" för Spårare. +google-grupp ger behörighet till en specifik **Delad enhet**. Alltså automatisk synkronisering att +t.ex Spårarledare ges behörighet till en **Delad enhet** för Spårare. Denna lösning använder Google Apps Script. Vid problem, fel, frågor eller tips på förbättringar eller fler funktioner som du saknar; @@ -13,48 +13,48 @@ I bland kommer det ny funktionalitet, så håll utkik på en ny version genom at **Watch** uppe till höger på sidan för att du kunna bli notifierad vid en ny version. Du kan ladda ner den senaste versionen [här](https://github.com/Scouterna/Google-Scoutnet-synk/releases/latest) och där kan -du också ser vilken funktionalitet som är ny i respektive version. Läs filen README.md +du också ser vilken funktionalitet som är ny i respektive version. Läs filen `README.md` för instruktion om installation och funktionalitet. ## [Dokumentation - läs mer här](https://github.com/Scouterna/Google-Scoutnet-synk/wiki) ## Inställningar ### Synkronisera användare & grupper -1. Logga in till Adminkonsolen för G Suite med ditt adminkonto och tryck på "Säkerhet". - Tryck på "API-referens", och tryck på kryssrutan för att "Aktivera API-åtkomst". +1. Logga in till Adminkonsolen för G Suite med ditt adminkonto och tryck på **Säkerhet**. + Tryck på **API-referens**, och tryck på kryssrutan för att **Aktivera API-åtkomst**. 1. I kårens G Suite ställer du in under Admin/Användare in en underorganisation som - heter "Scoutnet" (utan citationstecken). https://support.google.com/a/answer/182537?hl=en -1. I kårens G Suite ställer du in under Admin/Appar/G Suite och trycker på Scoutnet i + heter **Scoutnet** (utan citationstecken). https://support.google.com/a/answer/182537?hl=en +1. I kårens G Suite ställer du in under **Admin/Appar/G Suite** och trycker på Scoutnet i organisationsstrukturen till vänster och sätter på/ stänger av de tjänster som ska vara tillgängliga för de användare som synkroniseras. Tänk på att det är lättare att ha mycket avstängt och sen sätta på tjänster vid behov än tvärt om. - -- Om du trycker på "Katalog" kan du ställa in om användare ska få anpassa sina namn. + -- Om du trycker på **Katalog** kan du ställa in om användare ska få anpassa sina namn. Det går också att aktivera kontaktdelning inom kåren vilket kan underlätta kommunikationen internt. -1. Det går också att sätta på / stänga av inställningar under Admin/Appar/Ytterligare - tjänster från Google. Om ni har stängt av det tidigare behöver "Google Cloud Platform" +1. Det går också att sätta på och stänga av inställningar under **Admin/Appar/Ytterligare + tjänster** från Google. Om ni har stängt av det tidigare behöver **Google Cloud Platform** aktiveras för den användare som ska köra detta program. -1. Besök script.google.com när du är inloggad på kårens webbansvariges Google-konto +1. Besök `script.google.com` när du är inloggad på kårens webbansvariges Google-konto eller annat lämpligt Google-konto med hög behörighet på kårens G Suite. -1. Tryck på "Nytt Script" och namnge sedan projektet till något lämpligt, t.ex Scoutnet. +1. Tryck på **Nytt Script** och namnge sedan projektet till något lämpligt, t.ex **Scoutnet**. 1. Till vänster på skärmen listas de olika filer som finns i projektet och vid nu vid - starten finns endast en som heter Code.gs. Byt namn på den till "Användare" och + starten finns endast en som heter `Code.gs`. Byt namn på den till `Användare` och ta bort den koden som står i filen. -1. Klistra in koden från filen Anvandare.gs och spara (Ctrl+S). +1. Klistra in koden från filen `Anvandare.gs` och spara (Ctrl+S). 1. Gör samma sak för de andra filerna som slutar på .gs genom att skapa nya filer och klistra in koden för respektive. -1. Under "Resources"/"Advanced Google Services" behöver du aktivera "Admin Directory API", - "Google Sheets API" och "Group Settings API". På denna sida finns också en länk till - "Google API Console" (https://console.cloud.google.com/apis/library?project) där du - också behöver aktivera tjänsterna. Aktivera där "Admin SDK", "Google Sheets API", "Group Settings API". +1. Under **Resources**/**Advanced Google Services** behöver du aktivera **Admin Directory API**, + **Google Sheets API** och **Group Settings API**. På denna sida finns också en länk till + "Google API Console"(https://console.cloud.google.com/apis/library?project) där du + också behöver aktivera tjänsterna. Aktivera där **Admin SDK**, **Google Sheets API**, **Group Settings API**. 1. Gör inställningar enligt nedan för respektive fil. [Användare](#inställningar-för-att-komma-igång-i-konfigurationgs), [Grupper](#inställningar-för-att-komma-igång-i-konfigurationgs-1) -1. Kör programmet en gång genom att trycka på filen Användare.gs och välja funktionen - "AnvändareOchGrupper" upp bland menyn och tryck sedan på playknappen. +1. Kör programmet en gång genom att trycka på filen `Användare.gs` och välja funktionen + `AnvändareOchGrupper` upp bland menyn och tryck sedan på playknappen. 1. Du kan nu tidinställa hur ofta som programmen ska köra/synkronisera genom att trycka - på "klocksymbolen" i menyn och ställa in synkroniseringar. + på **klocksymbolen** i menyn och ställa in synkroniseringar. Tänk på att inte köra synkroniseringen för ofta då det finns maxbegränsningar per dag och som mestadels beror på antal grupper och e-postadresser i dessa. @@ -63,19 +63,19 @@ för instruktion om installation och funktionalitet. Om du har många användare och grupper som ska synkroniseras kan det hända att det tar för lång tid för programmet att klara av allt under en körning. Du kan då ställa in en - körning av "Användare" och en för "Grupper". Om körningen för "Grupper" trots allt tar - för lång tid finns i Grupper.gs funktionerna "GrupperVissaRader1" osv. som du kan ställa + körning av `Användare" och en för "Grupper`. Om körningen för `Grupper` trots allt tar + för lång tid finns i `Grupper.gs` funktionerna `GrupperVissaRader1` osv. som du kan ställa in att enbart vissa rader i kalkylarket ska synkroniseras. - Du kan här trycka på "notifications" och ställa in att att du får felmeddelanden om något + Du kan här trycka på **notifications** och ställa in att att du får felmeddelanden om något skulle gå fel. Om du vill att synkroniseringen av användarkonton och grupper ska ske - "samtidigt" (direkt efter varandra) så kan du ställa in den att exekvera funktionen - "AnvändareOchGrupper". -1. För att komma ihåg vilken version av programmet du har kan du t.ex trycka på "File"--> - "Manage versions" och sedan skrivna versionsnumret i rutan och sedan trycka på - "Save new version" + **samtidigt** (direkt efter varandra) så kan du ställa in den att exekvera funktionen + `AnvändareOchGrupper`. +1. För att komma ihåg vilken version av programmet du har kan du t.ex trycka på **File**--> + **Manage versions** och sedan skrivna versionsnumret i rutan och sedan trycka på + **Save new version**. ### Övriga program 1. Skapa en ny fil i samma projekt som tidigare och klistra in koden och kör. - Eventuellt kan du behöva lägga till någon inställning i konfigurationsfilen Konfiguration.gs. + Eventuellt kan du behöva lägga till någon inställning i konfigurationsfilen `Konfiguration.gs`. 1. Läs aktuellt avsnitt i manualen nedan. From 255d1711547f4c90cf1a22c44bad500feba5ea98 Mon Sep 17 00:00:00 2001 From: Emil Date: Fri, 1 Jan 2021 16:59:09 +0100 Subject: [PATCH 11/23] =?UTF-8?q?F=C3=B6rsta=20commit=20f=C3=B6r=20medlems?= =?UTF-8?q?listor=20synk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Anvandare.gs | 47 --- Gemensamma_funktioner.gs | 94 ++++- .../README.md" | 2 +- Grupper.gs | 45 --- Konfiguration.gs | 3 + Medlemslistor.gs | 367 ++++++++++++++++++ 6 files changed, 464 insertions(+), 94 deletions(-) create mode 100644 Medlemslistor.gs diff --git a/Anvandare.gs b/Anvandare.gs index 58a7f50..a194235 100644 --- a/Anvandare.gs +++ b/Anvandare.gs @@ -569,53 +569,6 @@ function getScoutleaders(allMembers) { } -/* - * Hämta lista över alla medlemmar - * - * @returns {Object[]} allMembers - Lista med medlemsobjekt för alla medlemmar i kåren - */ -function fetchScoutnetMembers() { - - var url = 'https://' + scoutnet_url + '/api/' + organisationType + '/memberlist?id=' + groupId + '&key=' + api_key_list_all + '&pretty=1'; - var response = UrlFetchApp.fetch(url, {'muteHttpExceptions': true}); - //Logger.log(response); - - var json = response.getContentText(); - var data = JSON.parse(json); - - var medlemmar = data.data; - var allMembers = []; - - //Logger.log(medlemmar); - for (x in medlemmar) { - var medlem = medlemmar[x]; - - var variabel_lista_not_lowercase = ['member_no', 'first_name', 'last_name', 'ssno', 'note', 'date_of_birth', 'status', - 'created_at', 'confirmed_at', 'group', 'unit', 'patrol', 'unit_role', 'group_role', - 'sex', 'address_co', 'address_1', 'address_2' , 'address_3', 'postcode', 'town', - 'country', 'contact_mobile_phone', 'contact_home_phone', 'contact_mothers_name', - 'contact_mobile_mum', 'contact_telephone_mum', 'contact_fathers_name', 'contact_mobile_dad', - 'contact_telephone_dad', 'prev_term', 'prev_term_due_date', 'current_term', - 'current_term_due_date', 'avatar_updated', 'avatar_url']; - - //Dessa attributvärden ska användas som gemener för bättre jämförelser - var variabel_lista_lowercase = ['email', 'contact_email_mum', 'contact_email_dad', 'contact_alt_email', 'extra_emails']; - - var member = setMemberFields(medlem, variabel_lista_not_lowercase, variabel_lista_lowercase); - - //Logger.log("MEMBER print object " + member); - //Logger.log("%s %s, Medlem %s, Mobil %s",member.first_name, member.last_name, member.member_no, member.contact_mobile_phone); //member.member_no + " " + member.first_name + " " + member.last_name); - //Logger.log(member.date_of_birth + " " + member.confirmed_at + " " + member.unit); - //Logger.log(member.unit_role + " " + member.group_role + " " + member.email); - //Logger.log(member.email_mum + " " + member.email_dad + " " + member.alt_email); - allMembers.push(member); - - } - //Logger.log("FETCH MEMBERS print object " + allMembers); - return allMembers; -} - - /* * Testfunktion för att lista alla Googlekonton som finns i underorganisationen "Scoutnet" * Max 200 stycken diff --git a/Gemensamma_funktioner.gs b/Gemensamma_funktioner.gs index 3c0f5b8..bdf9e94 100644 --- a/Gemensamma_funktioner.gs +++ b/Gemensamma_funktioner.gs @@ -547,6 +547,98 @@ function getEmailListSyncOption(member, synk_option, boolGoogleAccounts) { } +/* + * Hämta lista över alla medlemmar + * + * @returns {Object[]} allMembers - Lista med medlemsobjekt för alla medlemmar i kåren + */ +function fetchScoutnetMembers() { + + var url = 'https://' + scoutnet_url + '/api/' + organisationType + '/memberlist?id=' + groupId + '&key=' + api_key_list_all + '&pretty=1'; + var response = UrlFetchApp.fetch(url, {'muteHttpExceptions': true}); + //Logger.log(response); + + var json = response.getContentText(); + var data = JSON.parse(json); + + var medlemmar = data.data; + var allMembers = []; + + //Logger.log(medlemmar); + for (x in medlemmar) { + var medlem = medlemmar[x]; + + var variabel_lista_not_lowercase = ['member_no', 'first_name', 'last_name', 'ssno', 'note', 'date_of_birth', 'status', + 'created_at', 'confirmed_at', 'group', 'unit', 'patrol', 'unit_role', 'group_role', + 'sex', 'address_co', 'address_1', 'address_2' , 'address_3', 'postcode', 'town', + 'country', 'contact_mobile_phone', 'contact_home_phone', 'contact_mothers_name', + 'contact_mobile_mum', 'contact_telephone_mum', 'contact_fathers_name', 'contact_mobile_dad', + 'contact_telephone_dad', 'contact_leader_interest', 'prev_term', 'prev_term_due_date', + 'current_term', 'current_term_due_date', 'avatar_updated', 'avatar_url']; + + //Dessa attributvärden ska användas som gemener för bättre jämförelser + var variabel_lista_lowercase = ['email', 'contact_email_mum', 'contact_email_dad', 'contact_alt_email', 'extra_emails']; + + var member = setMemberFields(medlem, variabel_lista_not_lowercase, variabel_lista_lowercase); + + //Logger.log("MEMBER print object " + member); + //Logger.log("%s %s, Medlem %s, Mobil %s",member.first_name, member.last_name, member.member_no, member.contact_mobile_phone); //member.member_no + " " + member.first_name + " " + member.last_name); + //Logger.log(member.date_of_birth + " " + member.confirmed_at + " " + member.unit); + //Logger.log(member.unit_role + " " + member.group_role + " " + member.email); + //Logger.log(member.email_mum + " " + member.email_dad + " " + member.alt_email); + allMembers.push(member); + + } + //Logger.log("FETCH MEMBERS print object " + allMembers); + return allMembers; +} + + +/* + * Tar reda på vilka rader i kalkylarket som ska synkroniseras + * + * @param {string} start - önskad startrad att synkronisera från + * @param {string} slut - önskad slutrad att synkronisera till + * @param {string} maxRowNumer - maximalt radnummer som går att synkronisera + * + * @returns {Object} - Objekt med start- och slutrad att synkronisera + */ +function findWhatRowsToSync(start, slut, maxRowNumber) { + + var minRowStart = 3; + + if (typeof start ==='undefined' || start < minRowStart) { + start = minRowStart; + } + if (typeof slut ==='undefined' || slut > maxRowNumber) { + slut = maxRowNumber; + } + + var rowsToSync = { + "start": start, + "slut": slut + }; + return rowsToSync; +} + + +/* + * Ta bort rader från kalkylarket + * + * @param {Object} sheet - Googleobjekt + * @param {numbers[]} delete_rows - Lista med villka rader som ska tas bort + */ +function deleteRowsFromSpreadsheet(sheet, delete_rows) { + + for (var k = delete_rows.length-1; k >= 0 ; k--) { //Tar bort rader, starta nerifrån + + var tmp_row = delete_rows[k]; + Logger.log("Remove row " + tmp_row); + sheet.deleteRow(tmp_row); + } +} + + /* * Kolla om ett objekt är inkluderat i en lista * param, lista, objekt @@ -745,4 +837,4 @@ function removeDiacritics (str) { str = str.replace(defaultDiacriticsRemovalMap[i].letters, defaultDiacriticsRemovalMap[i].base); } return str; -} \ No newline at end of file +} diff --git "a/Google-drive-migrering/Steg2-tvingad-\303\244ndring-fil\303\244gare/README.md" "b/Google-drive-migrering/Steg2-tvingad-\303\244ndring-fil\303\244gare/README.md" index 9bcb20f..9be9846 100644 --- "a/Google-drive-migrering/Steg2-tvingad-\303\244ndring-fil\303\244gare/README.md" +++ "b/Google-drive-migrering/Steg2-tvingad-\303\244ndring-fil\303\244gare/README.md" @@ -5,7 +5,7 @@ Dessa skript gör olika saker och hjälper till med - Skapa filer som du själv äger som är kopior av orginalen och tar bort orginalfilen för dig så att du kan flytta över filerna. ## Inställningar - gemensamt -1. Besök när du är inloggad på kårens webbansvariges Google-konto eller annat lämpligt Google-konto med hög behörighet på kårens Google Workspace den mapp på Google drive där du vill lagra projektet. Där skapar du en ny fil på formatet `Google Apps Script`. +1. Besök när du är inloggad på kårens webbansvariges Google-konto eller annat lämpligt Google-konto med hög behörighet på kårens Google Workspace den mapp på Google drive där du vill lagra projektet. Där skapar du en ny fil på formatet **Google Apps Script**. 1. Till vänster på skärmen listas de olika filer som finns i projektet och nu vid starten finns endast en som heter `Code.gs`. Byt namn på den till `ListaÄgare` och ta bort den kod som står i filen. 1. Klistra in koden från filen `ListaÄgare.gs` och spara (Ctrl+S). 1. Skapa också nya filer för `ÄndraDelning` och `KopiaNyÄgare` och klistra in respektive kod där för att sen spara. diff --git a/Grupper.gs b/Grupper.gs index e7866e3..00b2e43 100644 --- a/Grupper.gs +++ b/Grupper.gs @@ -247,34 +247,6 @@ function Grupper(start, slut) { } -/* - * Tar reda på vilka rader i kalkylarket som ska synkroniseras - * - * @param {string} start - önskad startrad att synkronisera från - * @param {string} slut - önskad slutrad att synkronisera till - * @param {string} maxRowNumer - maximalt radnummer som går att synkronisera - * - * @returns {Object} - Objekt med start- och slutrad att synkronisera - */ -function findWhatRowsToSync(start, slut, maxRowNumber) { - - var minRowStart = 3; - - if (typeof start ==='undefined' || start < minRowStart) { - start = minRowStart; - } - if (typeof slut ==='undefined' || slut > maxRowNumber) { - slut = maxRowNumber; - } - - var rowsToSync = { - "start": start, - "slut": slut - }; - return rowsToSync; -} - - /* * Konvertera inställning om att arkivera e-brev till boolean * @@ -318,23 +290,6 @@ function checkIfIsArchivedShouldChange(input, boolIfArchive) { } -/* - * Ta bort rader från kalkylarket - * - * @param {Object} sheet - Googleobjekt - * @param {numbers[]} delete_rows - Lista med villka rader som ska tas bort - */ -function deleteRowsFromSpreadsheet(sheet, delete_rows) { - - for (var k = delete_rows.length-1; k >= 0 ; k--) { //Tar bort rader, starta nerifrån - - var tmp_row = delete_rows[k]; - Logger.log("Remove row " + tmp_row); - sheet.deleteRow(tmp_row); - } -} - - /* * Skiver in i kalkylarket länken till gruppen * diff --git a/Konfiguration.gs b/Konfiguration.gs index e9ff3b2..7a8a8fa 100644 --- a/Konfiguration.gs +++ b/Konfiguration.gs @@ -20,6 +20,9 @@ var api_key_mailinglists = '11122233356454d0dce624'; //Kan hittas i Scoutnet om //Länk till ert egenskapade Google kalkylark för att synkronisera google grupper var spreadsheetUrl_Grupper = 'https://docs.google.com/spreadsheets/d/12345abcdefg45454jydk0/edit#gid=0'; +//Länk till Google kalkylarket för att synkronisera google medlemslistor +var spreadsheetUrl_Medlemslistor = 'https://docs.google.com/spreadsheets/d/54321fedcba45454kdyj0/edit#gid=0'; + //E-post eller scoutnetListId för vart mejl om misstänkt spam till grupper ska skickas till //För e-postlistor som anges skickas endast till primär e-postadress listad i Scoutnet //T.ex 'webmaster@minscoutkår.se, 1234' diff --git a/Medlemslistor.gs b/Medlemslistor.gs new file mode 100644 index 0000000..10c60d3 --- /dev/null +++ b/Medlemslistor.gs @@ -0,0 +1,367 @@ +/** + * @author Emil Öhman + * @website https://github.com/Scouterna + */ + + +/** + * Returnerar lista med objekt för specialkolumner i kalkylarket med namn + * och formel + * + * @returns {Object[]} - Lista med objekt för specialkolumner i kalkylarket + */ +function getCustomFunctions() { + + var cf = [ + {'namn': 'Ålder', 'formel': '=DATEDIF(R[0]C[-37], TODAY(), "Y")'}, + {'namn': 'Dagar till nästa födelsedag', 'formel': '=DATE(YEAR(R[0]C[-38])+DATEDIF(R[0]C[-38],TODAY(),"Y")+1,MONTH(R[0]C[-38]),DAY(R[0]C[-38]))-TODAY()'}, + {'namn': 'Antal dagar som medlem i kåren', 'formel': '=DATEDIF(R[0]C[-36],TODAY(), "D")'} + ]; + + return cf; +} + + +/** + * Funktion för att ange att enbart vissa radintervall i kalkylarket + * för medlemslistor ska synkroniseras + * + * Exempelvis rad 0 till 10. Helt fritt att ändra själv + */ +function MedlemslistorVissaRader1() { + Medlemslistor(0, 10); +} + + +/** + * Funktion för att ange att enbart vissa radintervall i kalkylarket + * för medlemslistor ska synkroniseras + * + * Exempelvis rad 11 till 20. Helt fritt att ändra själv + */ +function MedlemslistorVissaRader2() { + Medlemslistor(11, 20); +} + + +/** + * Huvudfunktion för att hantera synkronisering av medlemslistor med Scoutnet + * + * @param {number} start - rad att börja synkronisera på + * @param {number} slut - rad att sluta synkronisera på + */ +function Medlemslistor(start, slut) { + + var sheet = SpreadsheetApp.openByUrl(spreadsheetUrl_Medlemslistor).getSheets()[0]; + var selection = sheet.getDataRange(); + var data = selection.getValues(); + + var grd = getMedlemslistorKonfigRubrikData(); + + var delete_rows = []; + + //Hämta lista med alla medlemmar i kåren och alla deras attribut + var allMembers = fetchScoutnetMembers(); + + var rowsToSync = findWhatRowsToSync(start, slut, data.length); + start = rowsToSync.start; + slut = rowsToSync.slut; + + Logger.log("Startrad " + start + " slutrad " + slut); + + for (var i = start-1; i < slut; i++) { + + var name = data[i][grd["namn"]]; + var scoutnet_list_id = data[i][grd["scoutnet_list_id"]]; + var spreadsheetUrl = data[i][grd["spreadsheetUrl"]]; + + var rad_nummer = i+1; + + Logger.log('Rad: ' + rad_nummer + ' Namn: ' + name + ' Scoutnet: ' + scoutnet_list_id + ' spreadsheetUrl: ' + spreadsheetUrl); + + var update_group = "yes"; + + var cell=selection.getCell(rad_nummer, grd["namn"]+1); + if (name=="") { //Kolla om fältet för namn är angivet + cell.setBackground("yellow"); + } + else { + if ("#ffffff" != cell.getBackground()) { + cell.setBackground("white"); + } + } + + if (spreadsheetUrl=="") { //Inget kalkylark är angivet + if (name=="" && scoutnet_list_id=="") { //Ta bort raden + Logger.log("Försöker ta bort rad " + rad_nummer); + delete_rows.push(rad_nummer); + } + update_group = "no"; + } + + var cell=selection.getCell(rad_nummer, grd["spreadsheetUrl"]+1); + var rowSpreadsheet; + try { + rowSpreadsheet = SpreadsheetApp.openByUrl(spreadsheetUrl); + + if ("#ffffff" != cell.getBackground()) { + cell.setBackground("white"); + } + } + catch (e) { //Om url är fel + Logger.log(e); + update_group = "no"; + cell.setBackground("red"); + } + + if (update_group == "yes") { + //Uppdatera aktuell medlemslista + updateMemberlist(selection, rad_nummer, data[i], grd, allMembers, rowSpreadsheet); + } + } + //Ta bort tomma radera i kalkylarket + deleteRowsFromSpreadsheet(sheet, delete_rows); +} + + +/** + * Uppdatera en lista över medlemmar + * + * @param {Objekt} selection - området på kalkylarket för alla listor som används just nu + * @param {number} rad_nummer - radnummer för aktuell medlemslista i kalkylarket + * @param {string[]} radInfo - lista med data för aktuell rad i kalkylarket + * @param {string[]} grd - lista med vilka kolumnindex som respektive parameter har + * @param {Object[]} allMembers - lista med medlemsobjekt + * @param {Object[]} spreadsheet - ett googleobjekt av typen Spreadsheet där listan finns + */ +function updateMemberlist(selection, rad_nummer, radInfo, grd, allMembers, spreadsheet) { + + /******/ + var scoutnet_list_id = radInfo[grd["scoutnet_list_id"]]; //Själva datan + var cell_scoutnet_list_id = selection.getCell(rad_nummer, grd["scoutnet_list_id"]+1); //Range + Logger.log(".......Synkronisering - hämta data............"); + var tmpMembersInAList = fetchScoutnetMembersMultipleMailinglists(scoutnet_list_id, cell_scoutnet_list_id, ""); + Logger.log(".......Slut Synkronisering - hämta data......."); + /***********************/ + + var membersInAList = [] + for (var i = 0; i obj.member_no == tmpMembersInAList[i].member_no); + membersInAList.push(obj); + Logger.log(obj); + } + + + var mlrd = getMedlemslistorRubrikData(); + Logger.log(mlrd); + var numAttrMembers = mlrd.length; + Logger.log("Antal medlemsattribut att använda " + numAttrMembers); + + + var sheet = spreadsheet.getSheets()[0]; + + /****Storlek på den gamla datan som ska bort***/ + var lastRow = sheet.getLastRow(); + var lastColumn = sheet.getLastColumn(); + var numRows = lastRow+1; + + if (membersInAList.length+1>lastRow) { + //Vi ska rensa om det blir fler rader i nya också + numRows = membersInAList.length+1; + } + + if (numAttrMembers>lastColumn) { + //Vi ska rensa om det blir fler kolumner i nya också + lastColumn = numAttrMembers; + } + Logger.log("lastColumn ska vara " + lastColumn); + Logger.log("lastRow ska vara " + lastRow); + + //Storlek på den gamla datan som ska bort + var range_allt = sheet.getRange(1, 1, numRows, lastColumn); + range_allt.clearContent(); + /*********************************************/ + + /****Storlek på den nya datan som ska in*****/ + var range_medlemmar = sheet.getRange(2, 1, membersInAList.length, numAttrMembers); + var memberMatrix = createMemberlistMatrix(membersInAList, mlrd); + Logger.log(memberMatrix); + range_medlemmar.setValues(memberMatrix); + /********************************************/ + + /****Storlek på den nya rubriken som ska in**/ + var range_rad1 = sheet.getRange(1, 1, 1, numAttrMembers); + range_rad1.setFontWeight("bold"); + range_rad1.setFontStyle("italic"); + + var memberRubrikMatrix = createMemberlistRubrikRow(mlrd); + range_rad1.setValues([memberRubrikMatrix]); + /********************************************/ + + setCustomColumns(sheet, numAttrMembers+1, membersInAList.length); +} + + +/** + * Bygger upp en rad med rubriker för medlemsdatan + * + * @param {Object[]} mlrd - en lista över rubriker och och attribut för tillhörande medlemmar + * + * @returns {string[]} - lista bestående av rubrikerna för medlemsdatan + */ +function createMemberlistRubrikRow(mlrd) { + + var row = []; + for (var i = 0; i Date: Fri, 1 Jan 2021 18:51:11 +0100 Subject: [PATCH 12/23] =?UTF-8?q?Medlemslistor=20-=20la=20till=20funktion?= =?UTF-8?q?=20f=C3=B6r=20att=20skapa=20rubriker?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Gemensamma_funktioner.gs | 3 ++- Medlemslistor.gs | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/Gemensamma_funktioner.gs b/Gemensamma_funktioner.gs index bdf9e94..d03f422 100644 --- a/Gemensamma_funktioner.gs +++ b/Gemensamma_funktioner.gs @@ -10,7 +10,8 @@ function Allt() { Anvandare(); - Grupper(); + Grupper(); + Medlemslistor(); } diff --git a/Medlemslistor.gs b/Medlemslistor.gs index 10c60d3..e5ec963 100644 --- a/Medlemslistor.gs +++ b/Medlemslistor.gs @@ -124,6 +124,29 @@ function Medlemslistor(start, slut) { } +/** + * Skapa kolumnrubriker i kalkylarket för medlemslistor konfig + */ +function skapaRubrikerMedlemslistor() { + + var sheet = SpreadsheetApp.openByUrl(spreadsheetUrl_Medlemslistor).getSheets()[0]; + + // Frys de två översta raderna på arket så att rubrikerna alltid syns + sheet.setFrozenRows(2); + + var range_rubrik = sheet.getRange(2, 1, 1, 3); + + var rubriker = [ + ["Namn", "Scoutnet-id", "Länk till kalkylark"] + ]; + + // Sätter våra rubriker på vårt område + range_rubrik.setValues(rubriker); + range_rubrik.setFontWeight("bold"); + range_rubrik.setFontStyle("italic"); +} + + /** * Uppdatera en lista över medlemmar * From 37b91e307ea9a60a0e6e3b86e482c8255308fee6 Mon Sep 17 00:00:00 2001 From: Emil Date: Fri, 8 Jan 2021 17:06:56 +0100 Subject: [PATCH 13/23] =?UTF-8?q?Medlemslistor=20-=20la=20till=20funktion?= =?UTF-8?q?=20f=C3=B6r=20att=20skicka=20ut=20e-brev?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Gemensamma_funktioner.gs | 23 +- Medlemslistor.gs | 484 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 490 insertions(+), 17 deletions(-) diff --git a/Gemensamma_funktioner.gs b/Gemensamma_funktioner.gs index d03f422..50aeec3 100644 --- a/Gemensamma_funktioner.gs +++ b/Gemensamma_funktioner.gs @@ -178,9 +178,8 @@ function fetchScoutnetMembersMultipleMailinglists(scoutnet_list_id, cell_scoutne Logger.log(typeof scoutnet_list_id); var allMembers = []; - scoutnet_list_id = scoutnet_list_id.toString(); //Vi gör om till string för att metoden replace ska fungera - scoutnet_list_id = scoutnet_list_id.replace(/\(.*?\)/g, ''); //Ta bort kommentarer inom parentes så de inte kommer med - scoutnet_list_id = scoutnet_list_id.replace(/\s+/g, ''); //Ta bort tomma mellanrum + + scoutnet_list_id = getCleanString(scoutnet_list_id); Logger.log("Innan splitt " + scoutnet_list_id); var tmp_id = scoutnet_list_id.split(","); @@ -623,6 +622,24 @@ function findWhatRowsToSync(start, slut, maxRowNumber) { } +/** + * Tar bort kommentarer inom parens samt tomrum i + * angiven variabel + * + * @param {string} input - en variabel + * + * @returns {string} - en textsträng utan kommentarer eller mellanrum + */ +function getCleanString(input) { + + input = input.toString(); //Vi gör om till string för att metoden replace ska fungera + input = input.replace(/\(.*?\)/g, ''); //Ta bort kommentarer inom parentes så de inte kommer med + input = input.replace(/\s+/g, ''); //Ta bort tomma mellanrum + + return input; +} + + /* * Ta bort rader från kalkylarket * diff --git a/Medlemslistor.gs b/Medlemslistor.gs index e5ec963..4f5e39a 100644 --- a/Medlemslistor.gs +++ b/Medlemslistor.gs @@ -75,8 +75,7 @@ function Medlemslistor(start, slut) { var scoutnet_list_id = data[i][grd["scoutnet_list_id"]]; var spreadsheetUrl = data[i][grd["spreadsheetUrl"]]; - var rad_nummer = i+1; - + var rad_nummer = i+1; Logger.log('Rad: ' + rad_nummer + ' Namn: ' + name + ' Scoutnet: ' + scoutnet_list_id + ' spreadsheetUrl: ' + spreadsheetUrl); var update_group = "yes"; @@ -116,7 +115,10 @@ function Medlemslistor(start, slut) { if (update_group == "yes") { //Uppdatera aktuell medlemslista - updateMemberlist(selection, rad_nummer, data[i], grd, allMembers, rowSpreadsheet); + updateMemberlist(selection, rad_nummer, data[i], grd, allMembers, rowSpreadsheet); + + //skicka ut e-brev till de i medlemslistan + skickaMedlemslista(selection, rad_nummer, data[i], grd, rowSpreadsheet); } } //Ta bort tomma radera i kalkylarket @@ -124,6 +126,404 @@ function Medlemslistor(start, slut) { } +/** + * Skickar ut e-brev till de i aktuell medlemlista + * + * @param {Object} selection - området på kalkylarket för alla listor som används just nu + * @param {number} rad_nummer - radnummer för aktuell medlemslista i kalkylarket + * @param {string[]} radInfo - lista med data för aktuell rad i kalkylarket + * @param {string[]} grd - lista med vilka kolumnindex som respektive parameter har + * @param {Object[]} rowSpreadsheet - ett googleobjekt av typen Spreadsheet där listan finns + */ +function skickaMedlemslista(selection, rad_nummer, radInfo, grd, rowSpreadsheet) { + + var email_draft_subject = radInfo[grd["email_draft_subject"]]; + var email_sender_name = radInfo[grd["email_sender_name"]]; + var email_sender_email = radInfo[grd["email_sender_email"]]; + var email_replyto = radInfo[grd["email_replyto"]]; + var email_noreply = radInfo[grd["email_noreply"]].toString(); + var email_recipient = radInfo[grd["email_recipient"]]; + var email_cc = radInfo[grd["email_cc"]]; + var email_bcc = radInfo[grd["email_bcc"]]; + + var sheet = rowSpreadsheet.getSheets()[0]; + var lastRow = sheet.getLastRow(); + var lastColumn = sheet.getLastColumn(); + Logger.log("lastColumn ska vara " + lastColumn); + Logger.log("lastRow ska vara " + lastRow); + + var attribut = getVerkligaRubriker(sheet); + var data = getVerkligMedlemslista(sheet); + + /***Dessa celler ska färgmarkeras eller ändras vid fel***/ + var cell_email_sender_email = selection.getCell(rad_nummer, grd["email_sender_email"]+1); + var cell_email_replyto = selection.getCell(rad_nummer, grd["email_replyto"]+1); + var cell_email_noreply = selection.getCell(rad_nummer, grd["email_noreply"]+1); + /*******************************************/ + + /***Dessa data hämta från utkastet och är lika för alla vid giltighetskontrollen***/ + Logger.log("Ämne på e-post i utkast " + email_draft_subject); + var draft = getDraft(email_draft_subject); + + var cell=selection.getCell(rad_nummer, grd["email_draft_subject"]+1); + if (!draft) { //Kolla om ämnesraden är korrekt + Logger.log("Ogiltig ämmnesrad " + email_draft_subject); + cell.setBackground("red"); + return; + } + else { + if ("#ffffff" != cell.getBackground()) { + cell.setBackground("white"); + } + } + + var cell=selection.getCell(rad_nummer, grd["email_sender_name"]+1); + if (email_sender_name) { //Kolla om fältet för avsändarnamn är angivet + if ("#ffffff" != cell.getBackground()) { + cell.setBackground("white"); + } + } + else { + Logger.log("Inget avsändarnamn angivet"); + cell.setBackground("yellow"); + } + /**************************************************************************/ + + for (var i = 0; i Date: Sat, 9 Jan 2021 10:39:22 +0100 Subject: [PATCH 14/23] =?UTF-8?q?Medlemslistor=20-=20Nu=20med=20formaterad?= =?UTF-8?q?=20br=C3=B6dtext=20och=20bilagor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Medlemslistor.gs | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/Medlemslistor.gs b/Medlemslistor.gs index 4f5e39a..9e2f627 100644 --- a/Medlemslistor.gs +++ b/Medlemslistor.gs @@ -189,6 +189,10 @@ function skickaMedlemslista(selection, rad_nummer, radInfo, grd, rowSpreadsheet) } /**************************************************************************/ + var body = draft.getBody(); + var plainBody = draft.getPlainBody(); + var attachments = draft.getAttachments(); + for (var i = 0; i Date: Wed, 13 Jan 2021 20:20:05 +0100 Subject: [PATCH 15/23] =?UTF-8?q?Medlemslistor=20-=20Kan=20koppla=20Google?= =?UTF-8?q?dokument=20f=C3=B6r=20att=20f=C3=A5=20dem=20personliga?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Gemensamma_funktioner.gs | 45 --------- Medlemslistor.gs | 212 ++++++++++++++++++++++++++++++++++----- 2 files changed, 185 insertions(+), 72 deletions(-) diff --git a/Gemensamma_funktioner.gs b/Gemensamma_funktioner.gs index 50aeec3..0f0f515 100644 --- a/Gemensamma_funktioner.gs +++ b/Gemensamma_funktioner.gs @@ -15,51 +15,6 @@ function Allt() { } -/** - * @todo - */ -function GetAttachments(inputString) { - - var filelist = inputString.split(","); - - var files_to_attach = []; - - for (var i = 0; i < filelist.length; i++) { - var fil = filelist[i] = filelist[i].trim(); - - var file = getFileById(fil); - if (!file) { - file = getFileByName(fil); - if(!file) { - Logger.log(fil + " kunde inte hittas på Google Drive, kontrollera indata och behörighet"); - //return false; //Gör detta så att man kan ändra färg om något är fel - } - } - - if (file) { //Denna fil ska läggas till - files_to_attach.push(file); - Logger.log(file + " finns"); - } - } - return files_to_attach; -} - - -/* - * Returerna Google Drive fil om fil med namnet är tillgänglig - * @todo - */ -function getFileByName(namn){ - - var file = DriveApp.getFilesByName(namn); - - if (file.hasNext()) { - return file.next(); - } - return false; -} - - /* * Returnera åldern på en medlem * @todo diff --git a/Medlemslistor.gs b/Medlemslistor.gs index 9e2f627..1cb2565 100644 --- a/Medlemslistor.gs +++ b/Medlemslistor.gs @@ -138,6 +138,9 @@ function Medlemslistor(start, slut) { function skickaMedlemslista(selection, rad_nummer, radInfo, grd, rowSpreadsheet) { var email_draft_subject = radInfo[grd["email_draft_subject"]]; + var email_condition = radInfo[grd["email_condition"]]; + var email_document_merge = radInfo[grd["email_document_merge"]]; + var email_sender_name = radInfo[grd["email_sender_name"]]; var email_sender_email = radInfo[grd["email_sender_email"]]; var email_replyto = radInfo[grd["email_replyto"]]; @@ -146,6 +149,7 @@ function skickaMedlemslista(selection, rad_nummer, radInfo, grd, rowSpreadsheet) var email_cc = radInfo[grd["email_cc"]]; var email_bcc = radInfo[grd["email_bcc"]]; + var sheet = rowSpreadsheet.getSheets()[0]; var lastRow = sheet.getLastRow(); var lastColumn = sheet.getLastColumn(); @@ -187,6 +191,30 @@ function skickaMedlemslista(selection, rad_nummer, radInfo, grd, rowSpreadsheet) Logger.log("Inget avsändarnamn angivet"); cell.setBackground("yellow"); } + + var cell=selection.getCell(rad_nummer, grd["email_document_merge"]+1); + var documentToMerge; + if (email_document_merge) { //Kolla om fältet för koppla dokument är angivet + + documentToMerge = getDocumentToMerge(email_document_merge); + + if (documentToMerge) { + Logger.log("Lyckades hitta dokument att koppla"); + Logger.log(documentToMerge); + if ("#ffffff" != cell.getBackground()) { + cell.setBackground("white"); + } + } + else { + Logger.log("Fel på något dokument-id"); + cell.setBackground("red"); + return; + } + } + else { + Logger.log("Inget koppla dokument angivet"); + cell.setBackground("yellow"); + } /**************************************************************************/ var body = draft.getBody(); @@ -261,16 +289,16 @@ function skickaMedlemslista(selection, rad_nummer, radInfo, grd, rowSpreadsheet) Logger.log("Ingen mottagare är angiven på något sätt. Vi hoppar över denna person"); continue; } - - /***Bilagor***/ - emailOptions["attachments"] = attachments; - /***Bilagor - Slut***/ - + /***Brödtext***/ var tmp_plainBody = replaceTemplate(plainBody, attribut, data[i]); var tmp_body = replaceTemplate(body, attribut, data[i]); emailOptions["htmlBody"] = tmp_body; /***Brödtext Slut***/ + + /***Bilagor***/ + emailOptions["attachments"] = getAndMakeAttachments(attachments, documentToMerge, attribut, data[i]); + /***Bilagor - Slut***/ Logger.log("tmp_email_recipient " + tmp_email_recipient); @@ -285,6 +313,142 @@ function skickaMedlemslista(selection, rad_nummer, radInfo, grd, rowSpreadsheet) } +/** + * Ger en lista med de bilagor som ska skickas + * genom att använda de bilagor som finns i utkastet samt de + * dokument som ska kopplas + * + * @param {Object[]} attachments - lista av objekt av typen GmailAttachment som finns i utkastet som bilaga + * @param {Object[]} documentToMerge - en lista av objekt av typen File + * @param {Object} attribut - ett objekt med kolumnrubriker och dess placeringar + * @param {string[]} dataArray - en lista innehållande persondata för en person + * + * @returns {Object[]} - lista av objekt för de bilagor som ska skickas + */ +function getAndMakeAttachments(attachments, documentToMerge, attribut, dataArray) { + + var tmp_attachments = []; + + for (var i = 0; i Date: Fri, 15 Jan 2021 22:37:14 +0100 Subject: [PATCH 16/23] =?UTF-8?q?Medlemslistor=20-=20Kan=20nu=20ers=C3=A4t?= =?UTF-8?q?ta=20kortkoder=20i=20br=C3=B6dtext,=20sidhuvud,=20sidfot=20och?= =?UTF-8?q?=20filnamn?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Medlemslistor.gs | 52 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 37 insertions(+), 15 deletions(-) diff --git a/Medlemslistor.gs b/Medlemslistor.gs index 1cb2565..47459e3 100644 --- a/Medlemslistor.gs +++ b/Medlemslistor.gs @@ -339,29 +339,24 @@ function getAndMakeAttachments(attachments, documentToMerge, attribut, dataArray var tmp_copy_id; try { var docName = documentToMerge[i].getName(); - tmp_copy_id = documentToMerge[i].makeCopy(docName).getId(); + var newDocName = replaceTemplate(docName, attribut, dataArray); + tmp_copy_id = documentToMerge[i].makeCopy(newDocName).getId(); var tmp_copy = DocumentApp.openById(tmp_copy_id); - var tmp_copy_body = tmp_copy.getBody(); - tmp_copy_body_text = tmp_copy_body.getText(); - - //Skapar en lista med alla kortkoder som används - var textMatches = getListOfUsedShortcodes(tmp_copy_body_text); - - for (var j = 0; textMatches && j Date: Fri, 15 Jan 2021 22:38:26 +0100 Subject: [PATCH 17/23] =?UTF-8?q?Tagit=20bort=20funktioner=20som=20ej=20an?= =?UTF-8?q?v=C3=A4nds=20i=20Gemensamma=5Ffunktioner.gs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Gemensamma_funktioner.gs | 60 ---------------------------------------- 1 file changed, 60 deletions(-) diff --git a/Gemensamma_funktioner.gs b/Gemensamma_funktioner.gs index 0f0f515..752634b 100644 --- a/Gemensamma_funktioner.gs +++ b/Gemensamma_funktioner.gs @@ -15,66 +15,6 @@ function Allt() { } -/* - * Returnera åldern på en medlem - * @todo - */ -function getAge(medlem) { - - var today = new Date(); - - //today.setDate(-60); //Test, sätt dag i månaden som dagens datum - var ms_today = today.getTime(); - - var medlem_born = convertStringToDate(medlem.date_of_birth); //Todays date as a Date object - var ms_medlem_born = medlem_born.getTime(); - - Logger.log("Dagens datum " + ms_today); - Logger.log("Födelsetid " + ms_medlem_born); - - var ms = ms_today - ms_medlem_born; - today.setTime(ms); - var age = today.getFullYear() - 1970; - Logger.log("Ålder " + age); - return age; -} - - -/* - * Konvertera textsträng på formen ÅÅÅÅ-MM-DD till ett datumobjekt - */ -function convertStringToDate(inputString) { - - Logger.log(inputString); - var yyyy = inputString.substring(0, 4); - var mm = inputString.substring(5, 7)-1; //January is 0! - var dd = inputString.substring(8, 10); - - Logger.log("YYYY " + yyyy); - Logger.log("mm " + mm); - Logger.log("dd " + dd); - - var myDate = new Date(); - myDate.setFullYear(yyyy); - myDate.setMonth(mm); - myDate.setDate(dd); - - return myDate; -} - - -/* - * Returerna Google Drive fil om fil med id är tillgänglig - */ -function getFileById(id){ - try { - return DriveApp.getFileById(id); - } catch (err) { - return false; - } -} - - /* * Tar bort punkter före @ om det är en gmailadress * From d8422e586db19a98cfd54b635cd80687fcf899a1 Mon Sep 17 00:00:00 2001 From: Emil Date: Sat, 16 Jan 2021 13:29:06 +0100 Subject: [PATCH 18/23] =?UTF-8?q?Medlemslistor=20-=20F=C3=A5tt=20det=20att?= =?UTF-8?q?=20fungera=20med=20villkor=20vilka=20som=20ska=20f=C3=A5=20e-br?= =?UTF-8?q?ev?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Medlemslistor.gs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/Medlemslistor.gs b/Medlemslistor.gs index 47459e3..4d28566 100644 --- a/Medlemslistor.gs +++ b/Medlemslistor.gs @@ -75,7 +75,7 @@ function Medlemslistor(start, slut) { var scoutnet_list_id = data[i][grd["scoutnet_list_id"]]; var spreadsheetUrl = data[i][grd["spreadsheetUrl"]]; - var rad_nummer = i+1; + var rad_nummer = i+1; Logger.log('Rad: ' + rad_nummer + ' Namn: ' + name + ' Scoutnet: ' + scoutnet_list_id + ' spreadsheetUrl: ' + spreadsheetUrl); var update_group = "yes"; @@ -223,6 +223,21 @@ function skickaMedlemslista(selection, rad_nummer, radInfo, grd, rowSpreadsheet) for (var i = 0; i Date: Sat, 16 Jan 2021 18:39:43 +0100 Subject: [PATCH 19/23] Medlemslistor - Flyttat startfunktioner till en egen fil --- Anvandare.gs | 8 ---- Grupper.gs | 28 -------------- Medlemslistor.gs | 48 ++--------------------- Start_funktioner.gs | 92 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 96 insertions(+), 80 deletions(-) create mode 100644 Start_funktioner.gs diff --git a/Anvandare.gs b/Anvandare.gs index a194235..a46e447 100644 --- a/Anvandare.gs +++ b/Anvandare.gs @@ -3,14 +3,6 @@ * @website https://github.com/Scouterna */ -/** - * Anropa denna funktion om du vill synkronisera både användare och grupper direkt efter varandra - */ -function AnvandareOchGrupper() { - Anvandare(); - Grupper(); -} - /* * Huvudfunktion för att hantera synkronisering av användarkonton med Scoutnet diff --git a/Grupper.gs b/Grupper.gs index 00b2e43..63606e8 100644 --- a/Grupper.gs +++ b/Grupper.gs @@ -36,34 +36,6 @@ function GrupperRubrikData() { } -/* - * Funktion för att ange att enbart vissa radintervall i kalkylarket ska synkroniseras - * - * Exempelvis rad 0 till 10. Helt fritt att ändra själv - */ -function GrupperVissaRader1() { - Grupper(0, 10); -} - -/* - * Funktion för att ange att enbart vissa radintervall i kalkylarket ska synkroniseras - * - * Exempelvis rad 11 till 20. Helt fritt att ändra själv - */ -function GrupperVissaRader2() { - Grupper(11, 20); -} - -/* - * Funktion för att ange att enbart vissa radintervall i kalkylarket ska synkroniseras - * - * Exempelvis 21 till 30. Helt fritt att ändra själv - */ -function GrupperVissaRader3() { - Grupper(21, 30); -} - - /* * Huvudfunktion för att hantera synkronisering av googlegrupper med Scoutnet */ diff --git a/Medlemslistor.gs b/Medlemslistor.gs index 4d28566..572c8db 100644 --- a/Medlemslistor.gs +++ b/Medlemslistor.gs @@ -4,46 +4,6 @@ */ -/** - * Returnerar lista med objekt för specialkolumner i kalkylarket med namn - * och formel - * - * @returns {Object[]} - Lista med objekt för specialkolumner i kalkylarket - */ -function getCustomFunctions() { - - var cf = [ - {'namn': 'Ålder', 'formel': '=DATEDIF(R[0]C[-37], TODAY(), "Y")'}, - {'namn': 'Dagar till nästa födelsedag', 'formel': '=DATE(YEAR(R[0]C[-38])+DATEDIF(R[0]C[-38],TODAY(),"Y")+1,MONTH(R[0]C[-38]),DAY(R[0]C[-38]))-TODAY()'}, - {'namn': 'Antal dagar som medlem i kåren', 'formel': '=DATEDIF(R[0]C[-36],TODAY(), "D")'} - ]; - - return cf; -} - - -/** - * Funktion för att ange att enbart vissa radintervall i kalkylarket - * för medlemslistor ska synkroniseras - * - * Exempelvis rad 0 till 10. Helt fritt att ändra själv - */ -function MedlemslistorVissaRader1() { - Medlemslistor(0, 10); -} - - -/** - * Funktion för att ange att enbart vissa radintervall i kalkylarket - * för medlemslistor ska synkroniseras - * - * Exempelvis rad 11 till 20. Helt fritt att ändra själv - */ -function MedlemslistorVissaRader2() { - Medlemslistor(11, 20); -} - - /** * Huvudfunktion för att hantera synkronisering av medlemslistor med Scoutnet * @@ -97,7 +57,7 @@ function Medlemslistor(start, slut) { } update_group = "no"; } - + var cell=selection.getCell(rad_nummer, grd["spreadsheetUrl"]+1); var rowSpreadsheet; try { @@ -224,7 +184,7 @@ function skickaMedlemslista(selection, rad_nummer, radInfo, grd, rowSpreadsheet) for (var i = 0; i + * @website https://github.com/Scouterna + */ + + +/** + * Anropa denna funktion om du vill synkronisera både användare och + * grupper direkt efter varandra + */ +function AnvandareOchGrupper() { + Anvandare(); + Grupper(); +} + + +/***Grupper***/ +/** + * Funktion för att alla rader i kalkylarket för medlemslistor + * ska synkroniseras och e-brev skickas ut + */ +function GrupperAllaRader() { + Grupper(); +} + +/** + * Funktioner för att ange att enbart vissa radintervall i kalkylarket + * ska synkroniseras + * + * Exempelvis rad 0 till 10. Helt fritt att ändra själv + */ +function GrupperVissaRader1() { + Grupper(0, 10); +} + +function GrupperVissaRader2() { + Grupper(11, 20); +} + +function GrupperVissaRader3() { + Grupper(21, 30); +} +/***Grupper - Slut***/ + + +/***Medlemslistor***/ +/** + * Funktion för att alla rader i kalkylarket för medlemslistor + * ska synkroniseras och e-brev skickas ut + */ +function MedlemslistorAllaRader() { + Medlemslistor(); +} + +/** + * Funktioner för att ange att enbart vissa radintervall i kalkylarket + * för medlemslistor ska synkroniseras och e-brev skickas ut + * + * Exempelvis rad 0 till 10. Helt fritt att ändra själv + */ +function MedlemslistorVissaRader1() { + Medlemslistor(0, 10); +} + +function MedlemslistorVissaRader2() { + Medlemslistor(11, 20); +} + +function MedlemslistorVissaRader2() { + Medlemslistor(21, 30); +} + +/** + * Ställer in egna attribut och de funktioner som körs för att räkna ut + * värdet på attributet för respektive person. + * Funktionerna använder R1C1 notation för att skriva formeln i google kalkylark + * och hänvisar då relativt aktuell kolumn till en rad R eller kolumn C från denna + * R[0]C[-37] betyder därmed att man hänvisar till samma rad (0 rader förändring) och + * till värdet i cellen 37 kolumner till vänster. + * + * Vilken plats som varje eget attribut får är att först sätts alla standardattribut + * ut och sedan nedanstående i ordning. Enklast är att testa för att se till att det + * blir korrekt. + * Observera att dessa påverkar alla medlemslistor som används, så var försiktig om du + * tar bort någon funktion nedan då den kanske används i någon annan lista. + */ +var medlemslista_egna_attribut_funktioner = [ + {'namn': 'Ålder', 'formel': '=DATEDIF(R[0]C[-37], TODAY(), "Y")'}, + {'namn': 'Dagar till nästa födelsedag', 'formel': '=DATE(YEAR(R[0]C[-38])+DATEDIF(R[0]C[-38],TODAY(),"Y")+1,MONTH(R[0]C[-38]),DAY(R[0]C[-38]))-TODAY()'}, + {'namn': 'Antal dagar som medlem i kåren', 'formel': '=DATEDIF(R[0]C[-36],TODAY(), "D")'} + ]; +/***Medlemslistor - Slut***/ From 488309fb19281cba8c2ab0ab5bdd695a66f70139 Mon Sep 17 00:00:00 2001 From: Emil Date: Sat, 16 Jan 2021 19:21:12 +0100 Subject: [PATCH 20/23] =?UTF-8?q?Medlemslistor=20-=20Fler=20startfunktione?= =?UTF-8?q?r=20och=20m=C3=B6jlighet=20att=20v=C3=A4lja=20att=20enbart=20up?= =?UTF-8?q?pdatera=20lista/skicka=20e-brev?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Medlemslistor.gs | 18 ++++++++++++------ Start_funktioner.gs | 24 +++++++++++++++++------- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/Medlemslistor.gs b/Medlemslistor.gs index 572c8db..8d32035 100644 --- a/Medlemslistor.gs +++ b/Medlemslistor.gs @@ -9,8 +9,10 @@ * * @param {number} start - rad att börja synkronisera på * @param {number} slut - rad att sluta synkronisera på + * @param {boolean} shouldUpdate - om medlemslistan ska uppdateras + * @param {boolean} shouldSend - om e-brev ska skickas ut till medlemlemslistan */ -function Medlemslistor(start, slut) { +function Medlemslistor(start, slut, shouldUpdate, shouldSend) { var sheet = SpreadsheetApp.openByUrl(spreadsheetUrl_Medlemslistor).getSheets()[0]; var selection = sheet.getDataRange(); @@ -74,11 +76,15 @@ function Medlemslistor(start, slut) { } if (update_group == "yes") { - //Uppdatera aktuell medlemslista - updateMemberlist(selection, rad_nummer, data[i], grd, allMembers, rowSpreadsheet); - - //skicka ut e-brev till de i medlemslistan - skickaMedlemslista(selection, rad_nummer, data[i], grd, rowSpreadsheet); + + if (null == shouldUpdate || shouldUpdate) { + //Uppdatera aktuell medlemslista + updateMemberlist(selection, rad_nummer, data[i], grd, allMembers, rowSpreadsheet); + } + if (null == shouldSend || shouldSend) { + //skicka ut e-brev till de i medlemslistan + skickaMedlemslista(selection, rad_nummer, data[i], grd, rowSpreadsheet); + } } } //Ta bort tomma radera i kalkylarket diff --git a/Start_funktioner.gs b/Start_funktioner.gs index 17494f1..58fb2f6 100644 --- a/Start_funktioner.gs +++ b/Start_funktioner.gs @@ -54,20 +54,30 @@ function MedlemslistorAllaRader() { /** * Funktioner för att ange att enbart vissa radintervall i kalkylarket - * för medlemslistor ska synkroniseras och e-brev skickas ut + * för medlemslistor ska synkroniseras och e-brev skickas ut. + * Samt ställa in om medlemslistor enbart ska uppdateras alternativt om + * gällande om e-brev ska skickas ut till listan * * Exempelvis rad 0 till 10. Helt fritt att ändra själv */ -function MedlemslistorVissaRader1() { - Medlemslistor(0, 10); +function MedlemslistorVissaRaderUppdateraOchSkicka1() { + Medlemslistor(0, 10, true, true); } -function MedlemslistorVissaRader2() { - Medlemslistor(11, 20); +function MedlemslistorVissaRaderUppdateraOchSkicka2() { + Medlemslistor(11, 20, true, true); } -function MedlemslistorVissaRader2() { - Medlemslistor(21, 30); +function MedlemslistorVissaRaderUppdateraOchSkicka3() { + Medlemslistor(21, 30, true, true); +} + +function MedlemslistorVissaRaderUppdateraEnbart1() { + Medlemslistor(0, 10, true, false); +} + +function MedlemslistorVissaRaderSkickaEnbart1() { + Medlemslistor(0, 10, false, true); } /** From 56dd357ccb6239ab0002fcf7e403411b0d51735e Mon Sep 17 00:00:00 2001 From: Emil Date: Sat, 23 Jan 2021 20:55:56 +0100 Subject: [PATCH 21/23] Uppdaterat Readme om medlemslistor --- README.md | 111 ++++++++++++++++++++---------------------------------- 1 file changed, 41 insertions(+), 70 deletions(-) diff --git a/README.md b/README.md index f667b51..9f84de3 100644 --- a/README.md +++ b/README.md @@ -1,81 +1,52 @@ # Google-Scoutnet-synkronisering -Du kan med dessa program synkronisera Google-användarkonton hos kåren med personer i Scoutnet -samt synkronisera google-grupper med e-postlistor i Scoutnet. +Du kan med dessa program göra följande +1. Synkronisera Google-användarkonton hos kåren med personer från Scoutnet. +2. Synkronisera google-grupper med e-postlistor i Scoutnet för att använda som e-postlistor samt för behörighetskontroller. Alltså t.ex. att spårarledare ges behörighet till en **Delad enhet** på Google drive för Spårare. +3. Synkronisera medlemslistor enligt dina urval från Scoutnet samt skicka ut personliga e-brev enligt dina inställningar till medlemmar. -Du kan använda dessa som e-postlistor eller som att lägga till att en specifik -google-grupp ger behörighet till en specifik **Delad enhet**. Alltså automatisk synkronisering att -t.ex Spårarledare ges behörighet till en **Delad enhet** för Spårare. -Denna lösning använder Google Apps Script. -Vid problem, fel, frågor eller tips på förbättringar eller fler funktioner som du saknar; -lägg ett ärende under "Issues" eller mejla emil.ohman@scouterna.se. -I bland kommer det ny funktionalitet, så håll utkik på en ny version genom att trycka på knappen -**Watch** uppe till höger på sidan för att du kunna bli notifierad vid en ny version. +- Denna lösning använder Google Apps Script. -Du kan ladda ner den senaste versionen [här](https://github.com/Scouterna/Google-Scoutnet-synk/releases/latest) och där kan -du också ser vilken funktionalitet som är ny i respektive version. Läs filen `README.md` +- Vid problem, fel, frågor eller tips på förbättringar eller fler funktioner som du saknar; +lägg ett ärende under **Issues** eller mejla emil.ohman@scouterna.se. + +- I bland kommer det ny funktionalitet, så håll utkik på en ny version genom att trycka på knappen +**Watch** uppe till höger på sidan för att kunna bli notifierad vid en ny version. + +- Du kan ladda ner den senaste versionen [här](https://github.com/Scouterna/Google-Scoutnet-synk/releases/latest) och där kan +du också se vilken funktionalitet som är ny i respektive version. Läs filen **README.md** för instruktion om installation och funktionalitet. ## [Dokumentation - läs mer här](https://github.com/Scouterna/Google-Scoutnet-synk/wiki) ## Inställningar ### Synkronisera användare & grupper -1. Logga in till Adminkonsolen för G Suite med ditt adminkonto och tryck på **Säkerhet**. - Tryck på **API-referens**, och tryck på kryssrutan för att **Aktivera API-åtkomst**. -1. I kårens G Suite ställer du in under Admin/Användare in en underorganisation som - heter **Scoutnet** (utan citationstecken). https://support.google.com/a/answer/182537?hl=en -1. I kårens G Suite ställer du in under **Admin/Appar/G Suite** och trycker på Scoutnet i - organisationsstrukturen till vänster och sätter på/ stänger av de tjänster som ska vara - tillgängliga för de användare som synkroniseras. - Tänk på att det är lättare att ha mycket - avstängt och sen sätta på tjänster vid behov än tvärt om. - -- Om du trycker på **Katalog** kan du ställa in om användare ska få anpassa sina namn. - Det går också att aktivera kontaktdelning inom kåren vilket kan underlätta - kommunikationen internt. -1. Det går också att sätta på och stänga av inställningar under **Admin/Appar/Ytterligare - tjänster** från Google. Om ni har stängt av det tidigare behöver **Google Cloud Platform** - aktiveras för den användare som ska köra detta program. -1. Besök `script.google.com` när du är inloggad på kårens webbansvariges Google-konto - eller annat lämpligt Google-konto med hög behörighet på kårens G Suite. -1. Tryck på **Nytt Script** och namnge sedan projektet till något lämpligt, t.ex **Scoutnet**. -1. Till vänster på skärmen listas de olika filer som finns i projektet och vid nu vid - starten finns endast en som heter `Code.gs`. Byt namn på den till `Användare` och +1. Logga in till [Adminkonsolen](https://admin.google.com/) med ditt adminkonto. +2. Under **Säkerhet/API-referens** tryck på kryssrutan för att **Aktivera API-åtkomst**. +3. I **Adminkonsolen** under **Organisationsenheter** skapar du en underorganisation till kåren som heter **Scoutnet**. Läs hur [här](https://support.google.com/a/answer/182537?hl=sv) +4. I **Adminkonsolen** ställer du in under **Appar/Google Workspace** vilka tjänster som ska vara tillgängliga för olika organisationsenheter. Om du trycker på **Scoutnet** i organisationsstrukturen till vänster kan du sätta på/stänga av de tjänster som ska vara tillgängliga för just de användare som ska synkroniseras. Tänk på att det är lättare att ha mycket avstängt och sen sätta på tjänster vid behov än tvärt om. + - Om du går in på [Kataloginställningar](https://admin.google.com/ac/appsettings/986128716205) kan du ställa in om användare ska få anpassa sina namn mm. + Det går också att aktivera kontaktdelning inom kåren vilket kan underlätta kommunikationen internt. + - Det går också att sätta på och stänga av inställningar under **Appar/Ytterligare tjänster från Google**. + Om ni har stängt av det tidigare behöver **Google Cloud Platform** aktiveras för den användare som ska köra dessa program. +5. Besök https://script.google.com inloggad med ditt adminkonto. +6. Tryck på **Nytt Script** och namnge sedan projektet till något lämpligt, t.ex. **Scoutnet**. +7. Till vänster på skärmen listas de olika filer som finns i projektet och nu vid starten finns endast en som heter `Kod.gs`. Byt namn på den till `Användare.gs` och ta bort den koden som står i filen. -1. Klistra in koden från filen `Anvandare.gs` och spara (Ctrl+S). -1. Gör samma sak för de andra filerna som slutar på .gs genom att skapa nya filer och - klistra in koden för respektive. -1. Under **Resources**/**Advanced Google Services** behöver du aktivera **Admin Directory API**, - **Google Sheets API** och **Group Settings API**. På denna sida finns också en länk till - "Google API Console"(https://console.cloud.google.com/apis/library?project) där du - också behöver aktivera tjänsterna. Aktivera där **Admin SDK**, **Google Sheets API**, **Group Settings API**. -1. Gör inställningar enligt nedan för respektive fil. - [Användare](#inställningar-för-att-komma-igång-i-konfigurationgs), - [Grupper](#inställningar-för-att-komma-igång-i-konfigurationgs-1) -1. Kör programmet en gång genom att trycka på filen `Användare.gs` och välja funktionen - `AnvändareOchGrupper` upp bland menyn och tryck sedan på playknappen. -1. Du kan nu tidinställa hur ofta som programmen ska köra/synkronisera genom att trycka - på **klocksymbolen** i menyn och ställa in synkroniseringar. - - Tänk på att inte köra synkroniseringen för ofta då det finns maxbegränsningar per dag - och som mestadels beror på antal grupper och e-postadresser i dessa. - Det bör räcka med att synkronisera användare en gång per dygn och samma för grupper, - förslagsvis mitt i natten. - - Om du har många användare och grupper som ska synkroniseras kan det hända att det tar - för lång tid för programmet att klara av allt under en körning. Du kan då ställa in en - körning av `Användare" och en för "Grupper`. Om körningen för `Grupper` trots allt tar - för lång tid finns i `Grupper.gs` funktionerna `GrupperVissaRader1` osv. som du kan ställa - in att enbart vissa rader i kalkylarket ska synkroniseras. - - Du kan här trycka på **notifications** och ställa in att att du får felmeddelanden om något - skulle gå fel. Om du vill att synkroniseringen av användarkonton och grupper ska ske - **samtidigt** (direkt efter varandra) så kan du ställa in den att exekvera funktionen - `AnvändareOchGrupper`. -1. För att komma ihåg vilken version av programmet du har kan du t.ex trycka på **File**--> - **Manage versions** och sedan skrivna versionsnumret i rutan och sedan trycka på - **Save new version**. - -### Övriga program -1. Skapa en ny fil i samma projekt som tidigare och klistra in koden och kör. - Eventuellt kan du behöva lägga till någon inställning i konfigurationsfilen `Konfiguration.gs`. -1. Läs aktuellt avsnitt i manualen nedan. +8. Klistra in koden från filen **Anvandare.gs** och spara (Ctrl+S). +9. Gör samma sak för de andra filerna som slutar på .gs genom att skapa nya filer och klistra in koden för respektive och spara (Ctrl+S). +11. Under **Tjänster** behöver du aktivera följande + - **Admin SDK API**. Kommer sen stå **AdminDirectory** efter tillagd. + - **Google Sheets API**. Kommer sen stå **Sheets** efter tillagd. + - **Group Settings API**. Kommer sen stå **AdminGroupsSettings** efter tillagd. +12. Gör inställningar enligt nedan för respektive skript för att sätta upp dem. + [Användare](https://github.com/Scouterna/Google-Scoutnet-synk/wiki/Manual-Användare#inställningar-för-att-komma-igång-i-konfigurationgs), + [Grupper](https://github.com/Scouterna/Google-Scoutnet-synk/wiki/Manual-Grupper#inställningar-för-att-komma-igång-i-konfigurationgs), [Medlemslistor](https://github.com/Scouterna/Google-Scoutnet-synk/wiki/Manual-Medlemslistor#inställningar-för-att-komma-igång-i-konfigurationgs) +13. Kör programmen genom att öppna filen **Start_funktioner.gs** och kör önskad funktion för att se att de olika skripten fungerar som de ska. Du kan t.ex välja funktionen **AnvändareOchGrupper** uppe bland menyn och sedan trycka på **Kör**. +13. Du kan nu tidinställa hur ofta som programmen ska köra/synkronisera genom att trycka på klocksymbolen i menyn till vänster och ställa in synkroniseringar för olika funktioner och skript. + - Tänk på att inte köra synkroniseringen för ofta då det finns maxbegränsningar hos Google per dag för olika operationer. Det rekommenderas också att ställa in enskilda synkroniseringar för de olika skripten då de annars kan ta för lång tid på sig och då inte lyckas synkronisera klart. + Det bör räcka med att synkronisera användare en gång per dygn och samma för grupper och medlemslistor; förslagsvis under natten. + - Om körningen för grupper trots allt tar + för lång tid finns i **Start_funktioner.gs** funktionerna `GrupperVissaRader1` osv. som du kan ställa in att enbart vissa rader i kalkylarket ska synkroniseras. + - Det finns också funktioner i **Start_funktioner.gs** för att enbart synkronisera vissa medlemslistor, enbart skicka e-brev mm om man vill dela upp saker. +14. För att komma ihåg vilken version av programmet du har kan du t.ex anteckna det i filen **Konfiguration.gs** på något sätt. From ff1a5969b07c1b7065d7176fc74235de3e957791 Mon Sep 17 00:00:00 2001 From: Emil Date: Sat, 23 Jan 2021 21:05:05 +0100 Subject: [PATCH 22/23] Readme textformattering --- README.md | 85 +++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 54 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 9f84de3..22686db 100644 --- a/README.md +++ b/README.md @@ -1,52 +1,75 @@ # Google-Scoutnet-synkronisering Du kan med dessa program göra följande 1. Synkronisera Google-användarkonton hos kåren med personer från Scoutnet. -2. Synkronisera google-grupper med e-postlistor i Scoutnet för att använda som e-postlistor samt för behörighetskontroller. Alltså t.ex. att spårarledare ges behörighet till en **Delad enhet** på Google drive för Spårare. -3. Synkronisera medlemslistor enligt dina urval från Scoutnet samt skicka ut personliga e-brev enligt dina inställningar till medlemmar. - +2. Synkronisera google-grupper med e-postlistor i Scoutnet för att använda som e-postlistor + samt för behörighetskontroller. Alltså t.ex. att spårarledare ges behörighet till en + **Delad enhet** på Google drive för Spårare. +3. Synkronisera medlemslistor enligt dina urval från Scoutnet samt skicka ut personliga + e-brev enligt dina inställningar till medlemmar. - Denna lösning använder Google Apps Script. - Vid problem, fel, frågor eller tips på förbättringar eller fler funktioner som du saknar; -lägg ett ärende under **Issues** eller mejla emil.ohman@scouterna.se. + lägg ett ärende under **Issues** eller mejla emil.ohman@scouterna.se. -- I bland kommer det ny funktionalitet, så håll utkik på en ny version genom att trycka på knappen -**Watch** uppe till höger på sidan för att kunna bli notifierad vid en ny version. +- I bland kommer det ny funktionalitet, så håll utkik på en ny version genom att trycka på + knappen **Watch** uppe till höger på sidan för att kunna bli notifierad vid en ny version. -- Du kan ladda ner den senaste versionen [här](https://github.com/Scouterna/Google-Scoutnet-synk/releases/latest) och där kan -du också se vilken funktionalitet som är ny i respektive version. Läs filen **README.md** -för instruktion om installation och funktionalitet. +- Du kan ladda ner den senaste versionen + [här](https://github.com/Scouterna/Google-Scoutnet-synk/releases/latest) och där kan + du också se vilken funktionalitet som är ny i respektive version. Läs filen **README.md** + för instruktion om installation och funktionalitet. ## [Dokumentation - läs mer här](https://github.com/Scouterna/Google-Scoutnet-synk/wiki) ## Inställningar -### Synkronisera användare & grupper 1. Logga in till [Adminkonsolen](https://admin.google.com/) med ditt adminkonto. -2. Under **Säkerhet/API-referens** tryck på kryssrutan för att **Aktivera API-åtkomst**. -3. I **Adminkonsolen** under **Organisationsenheter** skapar du en underorganisation till kåren som heter **Scoutnet**. Läs hur [här](https://support.google.com/a/answer/182537?hl=sv) -4. I **Adminkonsolen** ställer du in under **Appar/Google Workspace** vilka tjänster som ska vara tillgängliga för olika organisationsenheter. Om du trycker på **Scoutnet** i organisationsstrukturen till vänster kan du sätta på/stänga av de tjänster som ska vara tillgängliga för just de användare som ska synkroniseras. Tänk på att det är lättare att ha mycket avstängt och sen sätta på tjänster vid behov än tvärt om. - - Om du går in på [Kataloginställningar](https://admin.google.com/ac/appsettings/986128716205) kan du ställa in om användare ska få anpassa sina namn mm. +1. Under **Säkerhet/API-referens** tryck på kryssrutan för att **Aktivera API-åtkomst**. +1. I **Adminkonsolen** under **Organisationsenheter** skapar du en underorganisation till + kåren som heter **Scoutnet**. Läs hur [här](https://support.google.com/a/answer/182537?hl=sv) +2. I **Adminkonsolen** ställer du in under **Appar/Google Workspace** vilka tjänster som ska + vara tillgängliga för olika organisationsenheter. Om du trycker på **Scoutnet** i + organisationsstrukturen till vänster kan du sätta på/stänga av de tjänster som ska vara + tillgängliga för just de användare som ska synkroniseras. Tänk på att det är lättare att ha + mycket avstängt och sen sätta på tjänster vid behov än tvärt om. + - Om du går in på [Kataloginställningar](https://admin.google.com/ac/appsettings/986128716205) + kan du ställa in om användare ska få anpassa sina namn mm. Det går också att aktivera kontaktdelning inom kåren vilket kan underlätta kommunikationen internt. - - Det går också att sätta på och stänga av inställningar under **Appar/Ytterligare tjänster från Google**. - Om ni har stängt av det tidigare behöver **Google Cloud Platform** aktiveras för den användare som ska köra dessa program. -5. Besök https://script.google.com inloggad med ditt adminkonto. -6. Tryck på **Nytt Script** och namnge sedan projektet till något lämpligt, t.ex. **Scoutnet**. -7. Till vänster på skärmen listas de olika filer som finns i projektet och nu vid starten finns endast en som heter `Kod.gs`. Byt namn på den till `Användare.gs` och - ta bort den koden som står i filen. -8. Klistra in koden från filen **Anvandare.gs** och spara (Ctrl+S). -9. Gör samma sak för de andra filerna som slutar på .gs genom att skapa nya filer och klistra in koden för respektive och spara (Ctrl+S). -11. Under **Tjänster** behöver du aktivera följande + - Det går också att sätta på och stänga av inställningar under + **Appar/Ytterligare tjänster från Google**. + Om ni har stängt av det tidigare behöver **Google Cloud Platform** aktiveras för den användare som + ska köra dessa program. +3. Besök https://script.google.com inloggad med ditt adminkonto. +4. Tryck på **Nytt Script** och namnge sedan projektet till något lämpligt, t.ex. **Scoutnet**. +5. Till vänster på skärmen listas de olika filer som finns i projektet och nu vid starten finns endast + en som heter `Kod.gs`. Byt namn på den till `Användare.gs` och ta bort den koden som står i filen. +6. Klistra in koden från filen **Anvandare.gs** och spara (Ctrl+S). +7. Gör samma sak för de andra filerna som slutar på .gs genom att skapa nya filer och klistra in + koden för respektive och spara (Ctrl+S). +8. Under **Tjänster** behöver du aktivera följande: - **Admin SDK API**. Kommer sen stå **AdminDirectory** efter tillagd. - **Google Sheets API**. Kommer sen stå **Sheets** efter tillagd. - **Group Settings API**. Kommer sen stå **AdminGroupsSettings** efter tillagd. 12. Gör inställningar enligt nedan för respektive skript för att sätta upp dem. [Användare](https://github.com/Scouterna/Google-Scoutnet-synk/wiki/Manual-Användare#inställningar-för-att-komma-igång-i-konfigurationgs), [Grupper](https://github.com/Scouterna/Google-Scoutnet-synk/wiki/Manual-Grupper#inställningar-för-att-komma-igång-i-konfigurationgs), [Medlemslistor](https://github.com/Scouterna/Google-Scoutnet-synk/wiki/Manual-Medlemslistor#inställningar-för-att-komma-igång-i-konfigurationgs) -13. Kör programmen genom att öppna filen **Start_funktioner.gs** och kör önskad funktion för att se att de olika skripten fungerar som de ska. Du kan t.ex välja funktionen **AnvändareOchGrupper** uppe bland menyn och sedan trycka på **Kör**. -13. Du kan nu tidinställa hur ofta som programmen ska köra/synkronisera genom att trycka på klocksymbolen i menyn till vänster och ställa in synkroniseringar för olika funktioner och skript. - - Tänk på att inte köra synkroniseringen för ofta då det finns maxbegränsningar hos Google per dag för olika operationer. Det rekommenderas också att ställa in enskilda synkroniseringar för de olika skripten då de annars kan ta för lång tid på sig och då inte lyckas synkronisera klart. - Det bör räcka med att synkronisera användare en gång per dygn och samma för grupper och medlemslistor; förslagsvis under natten. - - Om körningen för grupper trots allt tar - för lång tid finns i **Start_funktioner.gs** funktionerna `GrupperVissaRader1` osv. som du kan ställa in att enbart vissa rader i kalkylarket ska synkroniseras. - - Det finns också funktioner i **Start_funktioner.gs** för att enbart synkronisera vissa medlemslistor, enbart skicka e-brev mm om man vill dela upp saker. -14. För att komma ihåg vilken version av programmet du har kan du t.ex anteckna det i filen **Konfiguration.gs** på något sätt. +13. Kör programmen genom att öppna filen **Start_funktioner.gs** och kör önskad funktion för att + se att de olika skripten fungerar som de ska. Du kan t.ex välja funktionen + **AnvändareOchGrupper** uppe bland menyn och sedan trycka på **Kör**. +14. Du kan nu tidinställa hur ofta som programmen ska köra/synkronisera genom att trycka på + klocksymbolen i menyn till vänster och ställa in synkroniseringar för olika funktioner och skript. + + - Tänk på att inte köra synkroniseringen för ofta då det finns maxbegränsningar hos Google per + dag för olika operationer. Det rekommenderas också att ställa in enskilda synkroniseringar för + de olika skripten då de annars kan ta för lång tid på sig och då inte lyckas synkronisera klart. + Det bör räcka med att synkronisera användare en gång per dygn och samma för grupper och + medlemslistor; förslagsvis under natten. + + - Om körningen för grupper trots allt tar för lång tid finns i **Start_funktioner.gs** + funktionerna `GrupperVissaRader1` osv. som du kan ställa in att enbart vissa rader i + kalkylarket ska synkroniseras. + + - Det finns också funktioner i **Start_funktioner.gs** för att enbart synkronisera vissa + medlemslistor, enbart skicka e-brev mm om man vill dela upp saker. +15. För att komma ihåg vilken version av programmet du har kan du t.ex anteckna det i filen + **Konfiguration.gs** på något sätt. From 977b740f41047897fabc7ef697b70ef7b7e9abd1 Mon Sep 17 00:00:00 2001 From: Emil Date: Sat, 30 Jan 2021 12:12:28 +0100 Subject: [PATCH 23/23] =?UTF-8?q?=C3=84ndrat=20om=20bland=20startfunktione?= =?UTF-8?q?rna?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Medlemslistor.gs | 35 +++++++++++++++++++++++++++++++++-- Start_funktioner.gs | 16 +++++++++++++++- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/Medlemslistor.gs b/Medlemslistor.gs index 8d32035..4724f45 100644 --- a/Medlemslistor.gs +++ b/Medlemslistor.gs @@ -4,6 +4,37 @@ */ +/** + * Funktion att använda för att enbart uppdatera en specifik + * medlemslista på en specifik rad + */ +function MedlemslistorVissaRaderUppdateraEnbartTmp() { + MedlemslistorEnRad(1, true, false); +} + + +/** + * Funktion att använda för att enbart skicka ut e-brev till + * en specifik medlemslista på en specifik rad + */ +function MedlemslistorVissaRaderSkickaEnbartTmp() { + MedlemslistorEnRad(1, false, true); +} + + +/** + * Funktion att använda för att ställa in att start- och slutrad + * är lika + * + * @param {number} radNummer - rad att synkronisera + * @param {boolean} shouldUpdate - om medlemslistan ska uppdateras + * @param {boolean} shouldSend - om e-brev ska skickas ut till medlemlemslistan + */ +function MedlemslistorEnRad(radNummer, shouldUpdate, shouldSend) { + Medlemslistor(radNummer, radNummer, shouldUpdate, shouldSend) +} + + /** * Huvudfunktion för att hantera synkronisering av medlemslistor med Scoutnet * @@ -59,7 +90,7 @@ function Medlemslistor(start, slut, shouldUpdate, shouldSend) { } update_group = "no"; } - + var cell=selection.getCell(rad_nummer, grd["spreadsheetUrl"]+1); var rowSpreadsheet; try { @@ -697,7 +728,7 @@ function getComparableString(text) { /** * Skapa kolumnrubriker i kalkylarket för medlemslistor konfig */ -function skapaRubrikerMedlemslistor() { +function skapaRubrikerML() { var sheet = SpreadsheetApp.openByUrl(spreadsheetUrl_Medlemslistor).getSheets()[0]; diff --git a/Start_funktioner.gs b/Start_funktioner.gs index 58fb2f6..d941ff8 100644 --- a/Start_funktioner.gs +++ b/Start_funktioner.gs @@ -16,7 +16,14 @@ function AnvandareOchGrupper() { /***Grupper***/ /** - * Funktion för att alla rader i kalkylarket för medlemslistor + * Anropar funktion för att skapa kolumnrubriker för kalkylarket + * för grupper + */ +function skapaRubrikerGrupper() { + createHeaders_Grupper(); +} +/** + * Funktion för att alla rader i kalkylarket för grupper * ska synkroniseras och e-brev skickas ut */ function GrupperAllaRader() { @@ -44,6 +51,13 @@ function GrupperVissaRader3() { /***Medlemslistor***/ +/** + * Anropar funktion för att skapa kolumnrubriker för kalkylarket + * för medlemslistor konfig + */ +function skapaRubrikerMedlemslistor() { + skapaRubrikerML(); +} /** * Funktion för att alla rader i kalkylarket för medlemslistor * ska synkroniseras och e-brev skickas ut