Mailman to Google Groups member list migration sample using Google Apps Script
/********************************************************************************* | |
* Mailman からのリスト移行サンプル using Google Apps Script | |
* 2015.09.07 M.Hotta | |
* | |
* 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); | |
for (var i = 0, len = users.length; i < len; i++) { | |
/* | |
if (prev.hasUser(users[i])) { | |
Logger.log('User %s exists. Skipping...', users[i]); | |
continue; | |
} | |
*/ | |
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 = "false"; // メッセージをアーカイブしない | |
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(); | |
} | |
} | |
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