-
-
Save kimipooh/39de29f4bfbf4f49c869bb1b8ff307a0 to your computer and use it in GitHub Desktop.
Mailman to Google Groups member list migration sample using Google Apps Script
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/********************************************************************************* | |
* Mailman からのリスト移行サンプル using Google Apps Script | |
* 2015.09.07 M.Hotta | |
* 2016.11.17 Kimiya Kitani (一部修正) | |
* | |
* 利用マニュアル | |
* http://net-newbie.com/apps/GoogleGroupsMigration.html | |
* | |
* Mailman における情報取得方法 | |
* リスト一覧の取得 mailman:/usr/lib/mailman/bin$ sudo ./list_lists | nkf -w | |
* (文字化けする場合は管理画面から取得) | |
* 購読者一覧の取得 mailman:/usr/lib/mailman/bin$ sudo ./list_members リスト名 | |
* 管理者一覧の取得 mailman:/usr/lib/mailman/bin$ sudo ./list_owners リスト名 | |
* | |
* スプレッドシートの書式 | |
* 第一列:属性名 | |
* 第二列:値(複数の値がある場合は複数行に記載) | |
* | |
* 属性名:(=移行対象) | |
* email: メーリングリストのメールアドレス | |
* name: メーリングリスト名 | |
* description: 説明文 | |
* owners: 所有者(≒管理者) | |
* members: 購読者 | |
* | |
* Class Spreadsheet | |
* https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet | |
*********************************************************************************/ | |
/********************************************************************************* | |
* メーリングリスト(グループ)の作成 | |
* https://developers.google.com/admin-sdk/directory/v1/reference/groups/insert | |
* @param email string : グループメールアドレス | |
* @param name string : メーリングリスト名 | |
* @param description string : グループの説明文 | |
*********************************************************************************/ | |
function addGroup(email, name, description) { | |
var group = { | |
"email": email, | |
"name": name, | |
"description": description | |
}; | |
try { | |
group = AdminDirectory.Groups.insert(group); | |
Logger.log('Group %s created with ID %s.', group.email, group.id); | |
} catch (e) { | |
Logger.log(e); | |
} | |
return true; | |
} // addGroup() | |
/********************************************************************************** | |
* グループへのオーナーの追加 | |
* @param groupEmail string : グループメールアドレス | |
* @param owners array : グループのオーナー | |
* role : | |
* OWNER - グループへのメール送信、メンバーの追加・削除、メンバーの | |
* ロール変更、グループ設定の変更・削除が可能。OWNER はグループの | |
* メンバーでなければならない。 | |
* MANAGER : Google Groups for Business でのみ有効なロール。 | |
* OWNER と同等のことが可能。ただし誰かを OWNER にするのとグループの | |
* 削除のみ不可。グループには複数の OWNER と MANAGER を設定可能。 | |
* MEMBER – グループへの参加、討論アーカイブの閲覧、グループメンバー | |
* 一覧の閲覧が可能。 | |
**********************************************************************************/ | |
function addGroupOwners(groupEmail, owners) { | |
for (var i = 0, len = owners.length; i < len; i++) { | |
var member = { | |
email: owners[i], | |
role: 'OWNER' | |
}; | |
try { | |
member = AdminDirectory.Members.insert(member, groupEmail); | |
Logger.log('Owner %s added.', member); | |
} catch (e) { | |
Logger.log(e); | |
} | |
} | |
} // addGroupOwners() | |
/********************************************************************************** | |
* グループへの購読メンバーの追加 | |
* @param groupEmail string : グループメールアドレス | |
* @param users array : グループの購読メンバー | |
**********************************************************************************/ | |
function addGroupMembers(groupEmail, users) { | |
var prev = GroupsApp.getGroupByEmail(groupEmail); | |
// 一度に300ぐらいが限界(Google Scriptのタイムアウト 6分の)のため、手動で下記の値を変更して実行 | |
// 一番末尾の数字は、 users.lengthになる。 | |
var start = 1; | |
var end = 300; | |
// var end = users.length; | |
for (var i = start, len = end; i < len; i++) { | |
var member = { | |
email: users[i], | |
role: 'MEMBER' | |
}; | |
try { | |
member = AdminDirectory.Members.insert(member, groupEmail); | |
Logger.log('User %s added.', member); | |
} catch (e) { | |
Logger.log(e); | |
} | |
} | |
} // addGroupMembers() | |
/********************************************************************************* | |
* グループの属性変更 | |
* https://developers.google.com/admin-sdk/groups-settings/quickstart/apps-script | |
* https://developers.google.com/admin-sdk/groups-settings/manage | |
* https://developers.google.com/admin-sdk/groups-settings/v1/reference/groups | |
* https://docs.google.com/spreadsheets/d/1UQfDi3MGf9sV7Ea9tSAXoR6qA5QpZQdZax0JVt_yopg/edit#gid=0 | |
*********************************************************************************/ | |
function updateGroupSettings(groupEmail) { | |
var group = AdminGroupsSettings.Groups.get(groupEmail); | |
// Logger.log(JSON.stringify(group, null, 2)); | |
group.replyTo = "REPLY_TO_LIST"; // 返信はMLへ | |
group.allowExternalMembers = "true"; // 組織外メンバーを許可 | |
group.isArchived = "true"; // メッセージをアーカイブする(kimipooh) | |
group.whoCanJoin = "INVITED_CAN_JOIN"; // 招待した人しか登録できない(kimipooh) | |
AdminGroupsSettings.Groups.patch(group, groupEmail); | |
} // updateGroupSettings() | |
/********************************************************************* | |
* 指定されたキーでA列を検索し、マッチした行のB列の値を配列で返す | |
*********************************************************************/ | |
function getValues(key) { | |
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); | |
key = key.toString().toLowerCase(); | |
var results = []; | |
var i = 0; | |
/* | |
for (row=1; row<=sheet.getLastRow(); row++) { | |
var key_a = sheet.getRange(row, 1).getValue().toString().toLowerCase(); | |
if (key_a == key) { | |
results[i++] = sheet.getRange(row, 2).getValue(); | |
} | |
} | |
*/ | |
// sheet.getRange(row, 1).getValue().toString().toLowerCase(); は処理が重すぎるといわれたので変更 by kimipooh | |
for (row=0; row < all_key.length; row++){ | |
var key_a = all_key[row][0]; | |
if (key_a == key) { | |
results[i++] = all_key[row][1]; | |
} | |
} | |
return results; | |
} // getValues() | |
/********************************************************************* | |
* main routine | |
*********************************************************************/ | |
function main() { | |
email = getValues('email'); | |
Logger.log("email = " + email); | |
name = getValues('name'); | |
Logger.log("name = " + name); | |
description = getValues('description'); | |
Logger.log("description = " + description); | |
owners = getValues('owners'); | |
Logger.log("owners = " + owners); | |
members = getValues('members'); | |
Logger.log("members = " + members); | |
addGroup(email, name, description); | |
updateGroupSettings(email); | |
addGroupOwners(email, owners); | |
addGroupMembers(email, members); | |
} // main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment