共有ドライブ管理者追加スクリプト

/**
 * Google Workspace管理者が指定した共有ドライブに自分自身を管理者として追加するスクリプト
 * Drive API v2を使用(permissions.insert)
 */

/**
 * メイン関数:共有ドライブに管理者として自分自身を追加
 */
function addMyselfAsSharedDriveAdmin() {
  // 共有ドライブIDを指定(実際のIDに変更してください)
  const sharedDriveId = 'YOUR_SHARED_DRIVE_ID_HERE';
  
  try {
    // 現在のユーザーのメールアドレスを取得
    const currentUserEmail = Session.getActiveUser().getEmail();
    
    // 共有ドライブに管理者として追加
    const result = addAdminToSharedDrive(sharedDriveId, currentUserEmail);
    
    if (result.success) {
      console.log(`成功: ${currentUserEmail} を共有ドライブの管理者として追加しました`);
      console.log(`Permission ID: ${result.permissionId}`);
    } else {
      console.error(`エラー: ${result.error}`);
    }
    
  } catch (error) {
    console.error('処理中にエラーが発生しました:', error.toString());
  }
}

/**
 * 共有ドライブにユーザーを管理者として追加する関数
 * @param {string} sharedDriveId - 共有ドライブのID
 * @param {string} userEmail - 追加するユーザーのメールアドレス
 * @returns {Object} 結果オブジェクト
 */
function addAdminToSharedDrive(sharedDriveId, userEmail) {
  try {
    // 既存の権限を確認
    const existingPermission = checkExistingPermission(sharedDriveId, userEmail);
    
    if (existingPermission) {
      // 既に権限がある場合は更新
      if (existingPermission.role === 'organizer') {
        return {
          success: true,
          message: 'ユーザーは既に管理者権限を持っています',
          permissionId: existingPermission.id
        };
      } else {
        // 既存権限を管理者に更新
        return updatePermissionToAdmin(sharedDriveId, existingPermission.id);
      }
    } else {
      // 新規権限を作成
      return createAdminPermission(sharedDriveId, userEmail);
    }
    
  } catch (error) {
    return {
      success: false,
      error: error.toString()
    };
  }
}

/**
 * 既存の権限を確認する関数
 * @param {string} sharedDriveId - 共有ドライブのID
 * @param {string} userEmail - ユーザーのメールアドレス
 * @returns {Object|null} 既存の権限オブジェクトまたはnull
 */
function checkExistingPermission(sharedDriveId, userEmail) {
  try {
    const permissions = Drive.Permissions.list(sharedDriveId, {
      supportsAllDrives: true,
      useDomainAdminAccess: true
    });
    
    if (permissions.items) {
      return permissions.items.find(permission => 
        permission.emailAddress === userEmail
      ) || null;
    }
    
    return null;
  } catch (error) {
    console.warn('権限確認中にエラー:', error.toString());
    return null;
  }
}

/**
 * 既存権限を管理者に更新する関数
 * @param {string} sharedDriveId - 共有ドライブのID
 * @param {string} permissionId - 権限ID
 * @returns {Object} 結果オブジェクト
 */
function updatePermissionToAdmin(sharedDriveId, permissionId) {
  try {
    const updatedPermission = Drive.Permissions.update(
      {
        role: 'organizer'
      },
      sharedDriveId,
      permissionId,
      {
        supportsAllDrives: true,
        useDomainAdminAccess: true
      }
    );
    
    return {
      success: true,
      message: '権限を管理者に更新しました',
      permissionId: updatedPermission.id
    };
    
  } catch (error) {
    return {
      success: false,
      error: `権限更新エラー: ${error.toString()}`
    };
  }
}

/**
 * 新規管理者権限を作成する関数(Drive API v2のpermissions.insertを使用)
 * @param {string} sharedDriveId - 共有ドライブのID
 * @param {string} userEmail - ユーザーのメールアドレス
 * @returns {Object} 結果オブジェクト
 */
function createAdminPermission(sharedDriveId, userEmail) {
  try {
    const permission = Drive.Permissions.insert(
      {
        role: 'organizer',
        type: 'user',
        value: userEmail
      },
      sharedDriveId,
      {
        sendNotificationEmails: false, // 通知メールを送信しない
        supportsAllDrives: true,       // 共有ドライブをサポート
        useDomainAdminAccess: true     // ドメイン管理者アクセスを使用
      }
    );
    
    return {
      success: true,
      message: '管理者権限を新規作成しました',
      permissionId: permission.id
    };
    
  } catch (error) {
    return {
      success: false,
      error: `権限作成エラー: ${error.toString()}`
    };
  }
}

/**
 * 複数の共有ドライブに一括で管理者として追加する関数
 * @param {string[]} sharedDriveIds - 共有ドライブIDの配列
 */
function addMyselfToMultipleSharedDrives(sharedDriveIds) {
  const currentUserEmail = Session.getActiveUser().getEmail();
  const results = [];
  
  sharedDriveIds.forEach(driveId => {
    console.log(`処理中: ${driveId}`);
    const result = addAdminToSharedDrive(driveId, currentUserEmail);
    results.push({
      driveId: driveId,
      result: result
    });
    
    // API制限を避けるため少し待機
    Utilities.sleep(100);
  });
  
  // 結果をログ出力
  results.forEach(item => {
    if (item.result.success) {
      console.log(`✓ ${item.driveId}: ${item.result.message}`);
    } else {
      console.error(`✗ ${item.driveId}: ${item.result.error}`);
    }
  });
  
  return results;
}

/**
 * 使用例とテスト関数
 */
function testScript() {
  // 使用例1: 自分自身を管理者として追加
  console.log('=== 自分自身を管理者として追加 ===');
  // addMyselfAsSharedDriveAdmin();
  
  // 使用例2: 複数の共有ドライブに一括追加
  console.log('\n=== 複数ドライブに一括追加 ===');
  const driveIds = [
    'YOUR_SHARED_DRIVE_ID1',
    'YOUR_SHARED_DRIVE_ID2',
    'YOUR_SHARED_DRIVE_ID3'
  ];
  // addMyselfToMultipleSharedDrives(driveIds);
  
}

/**
 * Drive API v2での共有ドライブ一覧取得(参考用)
 */
function listSharedDrives() {
  try {
    let nextPageToken = null;
    let totalCount = 0;
    
    do {
      const requestParams = {
        maxResults: 100,
        useDomainAdminAccess: true
      };
      
      // nextPageTokenがある場合は追加
      if (nextPageToken) {
        requestParams.pageToken = nextPageToken;
      }
      
      const drives = Drive.Drives.list(requestParams);
      
      if (drives.items && drives.items.length > 0) {
        drives.items.forEach(drive => {
          console.log(`${drive.name} (ID: ${drive.id})`);
        });
        totalCount += drives.items.length;
      }
      
      // 次のページのトークンを取得
      nextPageToken = drives.nextPageToken || null;
      
      // API制限を避けるため少し待機
      if (nextPageToken) {
        Utilities.sleep(100);
      }
      
    } while (nextPageToken);
    
    console.log(`合計: ${totalCount}件の共有ドライブ`);
    
  } catch (error) {
    console.error('共有ドライブ一覧取得エラー:', error.toString());
  }
}
GAS

Gmail検索・エクスポート GASコード詳細説明書

function searchGmailAndSaveToFile() {
  // 検索条件の設定
  const startDate = new Date('2025-07-12'); 
  const unixTime1 = startDate.getTime();
  const startNum = Math.floor(unixTime1/1000)-32400;

  const endDate = new Date('2025-07-13');   // 検索終了日時 (例: 2024年12月31日)
  const unixTime2 = endDate.getTime();
  const endNum = Math.floor(unixTime2/1000)-32400;
  const subjectKeyword = '会議';

  // 出力ファイルの設定
  const fileName = `Gmail検索結果_${Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyyMMdd_HHmmss')}.txt`;
  let outputContent = ''; // ファイルに書き込む内容を蓄積する変数

  // 日時をGmailのクエリ形式に変換
  const formattedStartDate = startNum.toString();
  const formattedEndDate = endNum.toString();

  // 検索クエリの作成
  const searchQuery = `after:${formattedStartDate} before:${formattedEndDate} subject:${subjectKeyword}`;

  Logger.log(`検索クエリ: ${searchQuery}`);
  outputContent += `検索クエリ: ${searchQuery}\n\n`;

  // Gmailを検索
  const threads = GmailApp.search(searchQuery);

  if (threads.length === 0) {
    Logger.log('該当するメールは見つかりませんでした。');
    outputContent += '該当するメールは見つかりませんでした。\n';
  } else {
    Logger.log(`見つかったメールの数: ${threads.length}`);
    outputContent += `見つかったメールの数: ${threads.length}\n\n`;

    // 各スレッド(会話)を処理
    threads.forEach(thread => {
      const messages = thread.getMessages();

      messages.forEach(message => {
        const subject = message.getSubject();
        const from = message.getFrom();
        const date = message.getDate();
        const body = message.getPlainBody();

        const messageInfo = `-----------------------------------\n` +
                          `日時: ${date}\n` +
                          `件名: ${subject}\n` +
                          `送信元: ${from}\n` +
                          `メッセージID: ${message.getId()}\n` +
                          `本文:\n${body}\n`; // 本文全体をファイルに出力

        Logger.log(messageInfo); // ログにも出力
        outputContent += messageInfo + '\n'; // ファイル内容に蓄積
      });
    });
  }

  // Google Driveにテキストファイルを作成
  try {
    DriveApp.createFile(fileName, outputContent, MimeType.PLAIN_TEXT);
    Logger.log(`ファイル "${fileName}" をGoogle Driveに作成しました。`);
  } catch (e) {
    Logger.log(`ファイルの作成中にエラーが発生しました: ${e.toString()}`);
  }
}

概要

このGoogle Apps Script(GAS)コードは、Gmailから指定した条件に合致するメールを検索し、メールの詳細情報(件名、送信者、日時、本文)をテキストファイルとしてGoogle Driveに自動保存する機能を提供します。

主な機能

  • 日時範囲指定: 特定の期間内のメールを検索
  • 件名フィルタ: 件名に特定のキーワードを含むメールを抽出
  • 詳細情報出力: メールの基本情報と本文全体を記録
  • 自動ファイル生成: 検索結果をタイムスタンプ付きファイル名で保存

コードの詳細解析

1. 検索条件の設定

const startDate = new Date('2025-07-12'); 
const endDate = new Date('2025-07-13');
const subjectKeyword = '会議';
  • 検索期間: 2025年7月12日( タイムゾーン : UTC+9時間 = 32400 で調整)
  • 検索キーワード: 件名に「会議」を含むメール

2. Unix時間への変換処理

const unixTime1 = startDate.getTime();
const startNum = Math.floor(unixTime1/1000)-32400;
  • JavaScriptの日付をUnix時間(秒)に変換
  • -32400は日本時間(JST)のタイムゾーン調整(UTC+9時間 = 32400秒)

3. ファイル名の動的生成

const fileName = `Gmail検索結果_${Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyyMMdd_HHmmss')}.txt`;
  • 実行時の日時を使用して一意のファイル名を生成
  • 形式例: Gmail検索結果_20250724_143055.txt

4. Gmail検索クエリの構築

const searchQuery = `after:${formattedStartDate} before:${formattedEndDate} subject:${subjectKeyword}`;
  • Gmailの高度な検索演算子を使用
  • after:before: で日時範囲を指定
  • subject: で件名検索を実行

5. メール情報の抽出と整形

各メールから以下の情報を抽出:

  • 日時: message.getDate()
  • 件名: message.getSubject()
  • 送信者: message.getFrom()
  • メッセージID: message.getId()
  • 本文: message.getPlainBody()(プレーンテキスト形式)

6. 出力形式

-----------------------------------
日時: [送信日時]
件名: [メールの件名]
送信元: [送信者のメールアドレス]
メッセージID: [Gmail内部ID]
本文:
[メール本文全体]

使用方法

1. 事前準備

  • Google Apps Scriptプロジェクトを作成
  • Gmailへのアクセス権限を付与
  • Google Driveへの書き込み権限を確認

2. カスタマイズ可能な設定

  • 検索期間: startDateendDate を変更
  • 検索キーワード: subjectKeyword を任意の文字列に変更
  • ファイル名: fileName の命名規則を調整

3. 実行方法

  1. GASエディタで関数 searchGmailAndSaveToFile() を選択
  2. 実行ボタンをクリック
  3. 権限承認を行う(初回のみ)
  4. Google Driveに結果ファイルが自動保存される

注意事項とベストプラクティス

セキュリティ

  • 権限スコープ: Gmail読み取りとDrive書き込み権限が必要
  • データ取り扱い: メール本文が平文でファイルに保存されるため、機密情報に注意

パフォーマンス

  • 実行時間制限: GASは6分の実行時間制限があるため、大量メール検索時は分割処理を検討
  • APIクォータ: Gmail APIの呼び出し制限に注意

エラーハンドリング

try {
  DriveApp.createFile(fileName, outputContent, MimeType.PLAIN_TEXT);
  Logger.log(`ファイル "${fileName}" をGoogle Driveに作成しました。`);
} catch (e) {
  Logger.log(`ファイルの作成中にエラーが発生しました: ${e.toString()}`);
}
  • ファイル作成時のエラーを適切にキャッチ
  • ログ出力でトラブルシューティングを支援

拡張可能性

機能追加の提案

  1. 添付ファイル処理: 添付ファイルの情報や保存機能
  2. CSV出力: 構造化データとしてCSV形式での出力
  3. メール分類: 送信者やラベル別の自動分類
  4. 定期実行: トリガー設定による自動実行
  5. 通知機能: 処理完了時のメール通知

検索条件の拡張例

// 複数キーワード検索
const searchQuery = `after:${startDate} before:${endDate} (subject:削除 OR subject:取消)`;

// 送信者指定
const searchQuery = `from:example@domain.com subject:${keyword}`;

// ラベル指定
const searchQuery = `label:重要 after:${startDate}`;

トラブルシューティング

よくある問題

  1. 権限エラー: Gmail/Drive APIの権限を再承認
  2. ファイル作成失敗: Drive容量不足やファイル名の文字制限を確認
  3. 検索結果が0件: 日時範囲やキーワードの設定を見直し
  4. タイムゾーンエラー: -32400の調整値を環境に合わせて変更

このコードは、メールアーカイブやコンプライアンス対応、データ分析など様々な用途で活用できる実用的なツールです。