node.jsでファイルをコピーする

node.jsのバージョン8.5.0以降では、ファイルをコピーする以下の関数を使用できます。

fs.copyFileSync(src, dest[, flags])

fs.copyFileSync()は、srcをdestに同期コピーします。

srcはコピーするファイルのファイル名、
destはコピー先のファイル名です。

flagsはオプションの引数で、fs.constants.COPYFILE_EXCLを指定すると、コピー先にすでにファイルが存在する場合は例外を投げます。
未指定の場合は上書きします。

次のコードはファイルをコピーします。
コピー先にすでにファイルが存在する場合は上書きします。

const fs = require('fs');

const src = 'source.txt';
const dest = 'destination.txt';

fs.copyFileSync(src, dest);

次のコードは、ファイルをコピーします。
コピー先にすでにファイルが存在する場合はエラーにします。

const fs = require('fs');

const src = 'source.txt';
const dest = 'destination.txt';

try {
  fs.copyFileSync(src, dest, fs.constants.COPYFILE_EXCL);
  console.log('ファイルをコピーしました。');
} catch (error) {
  console.log(error);
}

fs.copyFile(src, dest[, flags], callback)

ファイルを非同期でコピーします。

srcはコピーするファイルのファイル名、
destはコピー先のファイル名です。

flagsはオプションの引数で、fs.constants.COPYFILE_EXCLを指定すると、コピー先にすでにファイルが存在する場合は例外を投げます。
未指定の場合は上書きします。

次のコードはファイルをコピーします。
コピー先にすでにファイルが存在する場合は上書きします。

const fs = require('fs');

const src = 'source.txt';
const dest = 'destination.txt';

fs.copyFile(src, dest, (err) => {
  if (err) {
    throw err;
  } else {
    console.log('ファイルをコピーしました。');
  }
});

次のコードは、ファイルをコピーします。
コピー先にすでにファイルが存在する場合はエラーにします。

const fs = require('fs');

const src = 'source.txt';
const dest = 'destination.txt';

fs.copyFile(src, dest, fs.constants.COPYFILE_EXCL, (err) => {
  if (err) {
    throw err;
  } else {
    console.log('ファイルをコピーしました。');
  }
});

node.jsでパスの操作

node.jsでパスを操作するサンプルコードです。

実行結果は、Windowsで実行したときのものです。

絶対パスに変換する

const path = require('path');

const dir = path.resolve('C:/temp/path/sample.txt', '../dat');
console.log(dir); // => C:\temp\path\dat

相対パスを取得する

fromからtoへの相対パスを取得します。

const path = require('path');

const from = 'C:/temp/path/sample.txt';
const to = 'C:/temp/foo/bar';
console.log(path.relative(from, to)); // => ..\..\foo\bar

パスを分解する

const path = require('path');

const filename = 'C:/temp/path/sample.txt';

// ディレクトリ名を取得する
console.log(path.dirname(filename)); // => C:/temp/path

// ファイル名を取得する
console.log(path.basename(filename)); // => sample.txt

// ファイル名から拡張子を削除する
console.log(path.basename(filename, path.extname(filename))); // => sample

// 拡張子を取得する
console.log(path.extname(filename)); // => .txt

まとめて取得できます。

const path = require('path');

const parsedPath = path.parse('C:/temp/path/sample.txt');
console.log(parsedPath.root); // => C:/
console.log(parsedPath.dir); // => C:/temp/path
console.log(parsedPath.base); // => sample.txt
console.log(parsedPath.ext); // => .txt
console.log(parsedPath.name); // => sample

絶対パスかどうかを判定する

const path = require('path');

console.log(path.isAbsolute('/foo/bar')); // => true
console.log(path.isAbsolute('C:/foo/..')); // => true
console.log(path.isAbsolute('foo/bar')); // => false

パスを結合して、正規化したパスを取得する

const path = require('path');

console.log(path.join('/foo', 'bar', 'baz/asdf', 'quux', '..')); // => \foo\bar\baz\asdf
console.log(path.join('C:/foo', 'bar', '..', 'baz')); // => C:\foo\baz

パスを正規化する

const path = require('path');

console.log(path.normalize('/foo/bar//baz/asdf/quux/..')); // => \foo\bar\baz\asdf
console.log(path.normalize('C:\\temp\\\\foo\\bar\\..\\')); // => C:\temp\foo\

Google Apps ScriptでGoogle Driveのファイル一覧を取得する

Google Apps ScriptでGoogle Driveのファイル一覧を取得する方法です。

Driveのすべてのファイルを取得する

DriveAppクラスgetFiles()メソッドですべてのファイルを取得します。
getFiles()メソッドFileIteratorクラスのオブジェクトを返します。

var files = DriveApp.getFiles();

FileIteratorクラスのオブジェクトを取得したら、hasNext()メソッドで次のFileオブジェクトがあるかどうかを確認して、next()メソッドで次のFileオブジェクトを取得します。

while (files.hasNext()) {
    var file = files.next();
}

Fileオブジェクトを取得したら、getName()メソッドでファイル名を取得できます。

function getDriveFiles() {
    var files = DriveApp.getFiles();
    while (files.hasNext()) {
        var file = files.next();
        Logger.log(file.getName());
    }
}

次のコードは、ファイルの詳細な情報をスプレッドシートに出力します。

function createDriveFileList() {
    var sheet = SpreadsheetApp.getActiveSheet();
    var files = DriveApp.getFiles();
    var row = 1;
    while (files.hasNext()) {
        var file = files.next();
        sheet.getRange(row, 1).setValue(file.getName());
        sheet.getRange(row, 2).setValue(file.getSize());
        sheet.getRange(row, 3).setValue(Utilities.formatDate(file.getDateCreated(), "JST", "yyyy/MM/dd HH:mm:ss"));
        sheet.getRange(row, 4).setValue(Utilities.formatDate(file.getLastUpdated(), "JST", "yyyy/MM/dd HH:mm:ss"));
        sheet.getRange(row, 5).setValue(file.getDescription());
        sheet.getRange(row, 6).setValue(file.getDownloadUrl());
        sheet.getRange(row, 7).setValue(file.getId());
        sheet.getRange(row, 8).setValue(file.getOwner().getName());
        sheet.getRange(row, 9).setValue(file.getUrl());
        row++;
    }
}

Driveのフォルダー内のファイルを取得する

DriveAppクラスgetRootFolder()メソッドはルートのフォルダーのFolderオブジェクトを返します。

Folderオブジェクトは、getFiles()メソッドでフォルダー内のファイル一覧、getFolders()メソッドでフォルダーの一覧を返します。

次のコードはルートフォルダーのフォルダーとファイルをログに出力します。

function getRootFolder() {
    var rootFolder = DriveApp.getRootFolder();

    var folders = rootFolder.getFolders();
    while (folders.hasNext()) {
        var folder = folders.next();
        Logger.log(folder.getName() + "/");
    }

    var files = rootFolder.getFiles();
    while (files.hasNext()) {
        var file = files.next();
        Logger.log(file.getName());
    }
}

次のgetAllFiles()関数は、フォルダーとファイルの階層構造をスプレッドシートに出力します。

function getAllFiles() {
    var sheet = SpreadsheetApp.getActiveSheet();
    var rootFolder = DriveApp.getRootFolder();
    _printFolder(sheet, 1, 1, rootFolder);
}

function _printFolder(sheet, row, col, folder) {
    sheet.getRange(row, col).setValue(folder.getName() + "/");
    row++;

    var folders = folder.getFolders();
    while (folders.hasNext()) {
        var subFolder = folders.next();
        row = _printFolder(sheet, row, col + 1, subFolder);
    }

    var files = folder.getFiles();
    while (files.hasNext()) {
        var file = files.next();
        row = _printFile(sheet, row, col + 1, file);
    }
    return row;
}

function _printFile(sheet, row, col, file) {
    sheet.getRange(row, col).setValue(file.getName());
    return row + 1;
}

Google Apps ScriptでGmailのメールをSpreadsheetに書き出す

Google Apps ScriptでGmailのメールをSpreadsheetに書き出す

受信トレイにあるスレッドを取得する

受信トレイにあるスレッドを取得するには、GmailAppクラスgetInboxThreads()メソッドを使用します。

var threads = GmailApp.getInboxThreads();

getInboxThreads()メソッドGmailThreadオブジェクトの配列を返します。

スレッドからメールを取得する

スレッド内のメールの数はGmailThreadオブジェクトgetMessages()メソッドで取得できます。

Logger.log(thread.getMessageCount());

スレッド内のメールはGmailThreadオブジェクトgetMessages()メソッドで取得します。

getMessages()メソッドは、GmailMessageオブジェクトの配列を返します。

var messages = thread.getMessages();

メールの情報を取得する

GmailMessageオブジェクトのメソッドを使ってメールの情報を取得します。

// 差出人
var from = message.getFrom();
// 宛先
var to = message.getTo();
// 送信日時
var date = message.getDate();
// 件名
var subject = message.getSubject();
// 本文
var body = message.getBody();

GmailのメールをSpreadsheetに書き出す

GmailのメールをSpreadsheetに書き出すコードです。

function getMail() {
    var sheet = SpreadsheetApp.getActiveSheet();
    var threads = GmailApp.getInboxThreads();
    var row = 1;
    for (var i = 0; i < threads.length; i++) {
        var thread = threads[i];
        var messages = thread.getMessages();
        for (var j = 0; j < messages.length; j++) {
            var message = messages[j];
            var from = message.getFrom();
            var to = message.getTo();
            var date = message.getDate();
            var subject = message.getSubject();
            var body = message.getBody();
            sheet.getRange(row, 1).setValue(from);
            sheet.getRange(row, 2).setValue(to);
            sheet.getRange(row, 3).setValue(date);
            sheet.getRange(row, 4).setValue(subject);
            sheet.getRange(row, 5).setValue(body);
            row++;
        }
    }
}

Gmailのスレッドの件名をSpreadsheetに書き出す

Gmailのスレッドの件名をSpreadsheetに書き出すコードです。

function getThreadSubject() {
    var sheet = SpreadsheetApp.getActiveSheet();
    var threads = GmailApp.getInboxThreads();
    for (var i = 0; i < threads.length; i++) {
        sheet.getRange(i + 1, 1).setValue(threads[i].getFirstMessageSubject());
    }
}