Skip to content

Instantly share code, notes, and snippets.

@hotta
Last active November 18, 2016 01:34
Show Gist options
  • Save hotta/f29fdb18eb04d5df9d35 to your computer and use it in GitHub Desktop.
Save hotta/f29fdb18eb04d5df9d35 to your computer and use it in GitHub Desktop.
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