[GAS]makeCopyでスプレッドシートをコピーする際の注意点

2022.06.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

  • t_o_dと申します。
  • GASでテンプレートとして保存しているスプレッドシート等をコピーして使い回すケースはあると思います。
  • その際にGASで利用できるメソッドがmakeCopyですが、利用にあたり注意点があったので記録いたします。

環境

  • mac OS Monterey 12.2
  • Google Apps Script

基本の使い方

  • GASでmakeCopyメソッドを利用してスプレッドシートをコピーする基本的な方法は以下です。
// コピー元のスプレッドシート
const spreadId = 'スプレッドシートのシートID'
const file = DriveApp.getFileById(spreadId);

// コピー先のフォルダ
const folderId = 'コピー先のフォルダID'
const folder = DriveApp.getFolderById(folderId);

// 指定フォルダへコピー実行
const fileName = 'コピーファイル名'
file.makeCopy(fileName, folder);

問題点

同処理内で作成したファイルをコピーする場合は上手くコピーされない場合がある

  • 基本の使い方のように既存のスプレッドシートをコピーする場合ではなく、以下のように同処理内で作成したスプレッドシートに対してmakeCopyを実行する場合は一部中身がコピーされないことがあります。
// 新規にシートを作成して値を格納
const spread = SpreadsheetApp.create('作成ファイル名');
const sheet = spread.getActiveSheet();
const values = [['title', 'author'],['sample','t_o_d']]
sheet.getRange(1,1,values.length, values[0].length).setValues(values);

// 作成シート情報
const spreadId = spread.getId();
const file = DriveApp.getFileById(spreadId);

// コピー先のフォルダ情報
const folderId = 'コピー先のフォルダID'
const folder = DriveApp.getFolderById(folderId);

// 指定フォルダへコピー実行
const fileName = 'コピーファイル名'
file.makeCopy(fileName, folder);
  • 詳細は不明ですが、おそらく値の格納が終わっていないタイミングでコピー処理が走っていることが考えられます。

対策

flush処理の利用

  • 対策として、以下のようにコピー処理の前にGASメソッドのflushを入れることで解決いたしました。
// 作成処理省略

// 変更の適用
SpreadsheetApp.flush();

// 指定フォルダへコピー実行
const fileName = 'コピーファイル名'
file.makeCopy(fileName, folder);
  • こちらにも記載されていますが、getValue等の操作メソッドをループ処理で大量に呼び出した場合は反映に時間がかかる場合があるらしいです。
  • 今回の例でコピー不足が起こることは考えづらいですが、万が一の事を考えて基本的に入れておく方針にするのも有りかなと思います。

参考

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。