今更だけどChatGPTにGAS作ってもらってみたら

GAS

今話題のChatGPTですが、最近は思ったよりすごくないぞという風潮が高まってきたように感じます。
確かに何か物事を教えてもらうと知ったかぶりや誤った知識をもってくるのは確かなようでした。
でも、個人的には触ってみたらすごいぞと思いました。

というのも、GASを書いてくれるんです。
ちょっとした「あれ?この日付どうやって出すんだっけ」とか「この分岐の場合裏を実装するにはどんなIFになるんだっけ」とか一瞬で回答してくれます。
一連の処理をまるっと書いてもらうのは不安が残りますのでデバッグが結構必要になったりするのですが、ちょっとしたスニペットくらいのものならパッとでてきてパッと使えます。

実際に作ってもらったコード載っけてみます。
ChatGPTにこんな質問をしました。

GASで毎月特定のスプレッドシートを特定のフォルダにコピーするコードを教えてください。 コピーするスプレッドシートの名前はその月の年月を含めて「yyyyMM_資料」という名前にしてください。

function copySpreadsheetToFolder() {
  // コピー元のスプレッドシートID
  var spreadsheetId = "ここにスプレッドシートIDを入力";
  
  // コピーするフォルダID
  var folderId = "ここにフォルダIDを入力";
  
  // 今月の年月を取得
  var today = new Date();
  var year = today.getFullYear();
  var month = ("0" + (today.getMonth() + 1)).slice(-2);
  var yearMonth = year + month;
  
  // コピー先のスプレッドシート名
  var newSpreadsheetName = yearMonth + "_資料";
  
  // スプレッドシートをコピーして、コピー先のフォルダに移動する
  var copiedSpreadsheet = DriveApp.getFileById(spreadsheetId).makeCopy(newSpreadsheetName, DriveApp.getFolderById(folderId));
}
コード内の「ここにスプレッドシートIDを入力」と「ここにフォルダIDを入力」の部分に、実際のスプレッドシートIDとフォルダIDをそれぞれ入力してください。また、スプレッドシートの名前は「yyyyMM_資料」という形式でコピーされるようになっています。

初めて見たときはちょっと怖くなりました。日本語でコメントまで書いてくれていますからね。
yyyyMMの意味とかも理解しているし、日付の作り方も問題ありません。

ただ、「毎月」というところには言及してくれませんでしたね。別件のときはトリガーについても教えてくれたのですが、このチャットではスルーされました。

上記のコードを、カレントフォルダに「yyyyMM」というフォルダを作成し、そのフォルダにスプレッドシートのコピーを4つ作成するように変更してください。 スプレッドシートの名前は「資料_n」とし、nには連番が入るようにしてください。

以下のGoogle Apps Scriptコードで、カレントフォルダに「yyyyMM」というフォルダを作成し、そのフォルダにスプレッドシートのコピーを4つ作成することができます。スプレッドシートの名前は「資料_n」とし、nには連番が入ります。
function copySpreadsheetToCurrentFolder() {
  // コピー元のスプレッドシートID
  var spreadsheetId = "ここにスプレッドシートIDを入力";
  
  // 今月の年月を取得
  var today = new Date();
  var year = today.getFullYear();
  var month = ("0" + (today.getMonth() + 1)).slice(-2);
  var yearMonth = year + month;
  
  // 「yyyyMM」のフォルダを作成
  var folder = DriveApp.getRootFolder().createFolder(yearMonth);
  
  // スプレッドシートをコピーして、コピー先のフォルダに移動する
  for (var i = 1; i <= 4; i++) {
    var newSpreadsheetName = "資料_" + i;
    var copiedSpreadsheet = DriveApp.getFileById(spreadsheetId).makeCopy(newSpreadsheetName, folder);
  }
}
コード内の「ここにスプレッドシートIDを入力」の部分に、実際のスプレッドシートIDを入力してください。また、スプレッドシートの名前は「資料_n」という形式でコピーされ、nには1から4までの連番が入ります。なお、このコードはスクリプトを実行したGoogleドライブのルートフォルダに「yyyyMM」というフォルダを作成するので、スクリプトを実行する前にルートフォルダ内に同名のフォルダが存在しないことを確認してください。

上記のコードを変更してください~ とかnはこういう意味ですとかきちんと期待に応えてくれています。
同名のフォルダが存在しないことを確認してくださいとまで忠告してくれました。わかりました。

上記のコードに「yyyyMM」というフォルダの存在チェックし、フォルダがなければ作成する処理を追加してください。

以下のGoogle Apps Scriptコードで、カレントフォルダに「yyyyMM」というフォルダを作成し、そのフォルダにスプレッドシートのコピーを4つ作成することができます。フォルダの存在チェックを行い、フォルダが存在しなければ作成する処理を追加しています。スプレッドシートの名前は「資料_n」とし、nには連番が入ります。
function copySpreadsheetToCurrentFolder() {
  // コピー元のスプレッドシートID
  var spreadsheetId = "ここにスプレッドシートIDを入力";
  
  // 今月の年月を取得
  var today = new Date();
  var year = today.getFullYear();
  var month = ("0" + (today.getMonth() + 1)).slice(-2);
  var yearMonth = year + month;
  
  // 「yyyyMM」のフォルダを作成
  var folderIterator = DriveApp.getRootFolder().getFoldersByName(yearMonth);
  var folder;
  if (folderIterator.hasNext()) {
    folder = folderIterator.next();
  } else {
    folder = DriveApp.getRootFolder().createFolder(yearMonth);
  }
  
  // スプレッドシートをコピーして、コピー先のフォルダに移動する
  for (var i = 1; i <= 4; i++) {
    var newSpreadsheetName = "資料_" + i;
    var copiedSpreadsheet = DriveApp.getFileById(spreadsheetId).makeCopy(newSpreadsheetName, folder);
  }
}
コード内の「ここにスプレッドシートIDを入力」の部分に、実際のスプレッドシートIDを入力してください。また、スプレッドシートの名前は「資料_n」という形式でコピーされ、nには1から4までの連番が入ります。なお、このコードはスクリプトを実行したGoogleドライブのルートフォルダに「yyyyMM」というフォルダが存在しない場合に作成するようになっています。

会話が通じてる・・・素晴らしい・・・

ここまでは会話形式でしたが、箇条書きで要件を書いても理解してくれました。

こんな箇条書きでも文句言わず生成してくれる

下記の要件を満たすGASのコードを作成してください。
・特定のフォルダに配置されたスプレッドシートにGASを実装する
・カレントフォルダに年月を「yyyyMM」形式で表現したフォルダ名のフォルダを作成する。もしすでに存在していたら作成しない
・スプレッドシートの「テンプレート」シートのB列に記載したGoogleドキュメントのURLで示したファイルを、それぞれ作成した年月のフォルダにコピーする
・コピー先のファイル名はURLが記載してあった行番号を先頭につけ、「n_テンプレート」というファイル名にする。(nは行番号)
・コピーが完了したら「xxxxxxxxxx@gmail.com」宛てにメールを送信する。件名は「[月次処理]ドキュメントコピー完了」とし、本文は「yyyyMM」のフォルダへのURLを記載する。
・もしコピーが失敗またはURLが1つもなかった場合は、同じメールアドレスに件名「[月次処理無し]ドキュメントコピー」として、本文は「処理が失敗またはコピー対象が1つもありませんでした。」という内容でメール送信する

ドキドキ・・・返ってきた答えは

function copyDocsToFolder() {
  const folderName = Utilities.formatDate(new Date(), 'JST', 'yyyyMM');
  const templateSheetName = 'テンプレート';
  const folder = DriveApp.getFolderById('YOUR_FOLDER_ID');
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const templateSheet = spreadsheet.getSheetByName(templateSheetName);
  const templateRange = templateSheet.getRange('B2:B');
  const urls = templateRange.getValues().flat().filter(url => url !== '');
  const destinationFolder = createOrGetFolder(folder, folderName);
  const copiedDocs = copyDocsToFolderByUrl(destinationFolder, urls);
  const email = 'xxxxxxxxxx@gmail.com';
  let subject, body;
  if (copiedDocs.length === 0) {
    subject = '[月次処理無し]ドキュメントコピー';
    body = '処理が失敗またはコピー対象が1つもありませんでした。';
  } else {
    subject = '[月次処理]ドキュメントコピー完了';
    const destinationUrl = destinationFolder.getUrl();
    body = `${folderName}のフォルダへのURL: ${destinationUrl}\n\nコピーされたファイル:\n`;
    copiedDocs.forEach(copiedDoc => {
      body += `・${copiedDoc.name}\n`;
    });
  }
  MailApp.sendEmail(email, subject, body);
}

function createOrGetFolder(parentFolder, folderName) {
  const folders = parentFolder.getFoldersByName(folderName);
  if (folders.hasNext()) {
    return folders.next();
  } else {
    return parentFolder.createFolder(folderName);
  }
}

function copyDocsToFolderByUrl(destinationFolder, urls) {
  const copiedDocs = [];
  urls.forEach((url, i) => {
    try {
      const document = DocumentApp.openByUrl(url);
      const docName = `${i+2}_テンプレート`;
      const copiedFile = document.makeCopy(docName, destinationFolder);
      copiedDocs.push(copiedFile);
    } catch (e) {
      console.error(`Error copying document from URL: ${url}`);
    }
  });
  return copiedDocs;
}
【注意】コード中の YOUR_FOLDER_ID を、スクリプトで処理する特定のフォルダのIDに置き換えてください。

なんとなく素っ気なくなった気がするのは私だけでしょうか。
でもしっかりコードを作ってくれました。

B列のURLを取得してくださいといっただけでちゃんとヘッダーを想像してB2から列を取得しているのが偉い。偉いぞ。
後の行番号も+2して矛盾がないようにしていました。賢い。

列を取得した後に空白を想定した1次元配列化するワンライナーも勉強になりました。
独学でえっさほいさ頑張っていた人にはいい教師にもなりそうです。というかなりました。

スポンサーリンク

感想

ちなみにちょっと触ってみて感じたことは、検索と同じくちょっとした慣れが必要そうだな、ということです。
特にコード生成してもらうことに関しては検索でもググり力というか、検索スキルとか言われるものが必要だと感じました。
つまり、検索が下手な人と上手な人とではChatGPTのようなチャット型AIを使うのにも技量差が出てくるということです。

例えば、この記事で生成してみた「特定のフォルダに特定のスプシをコピーしてもらう処理」を作ってもらうにしても、コアとなる部分の処理→それに付随する細かい処理→細かい処理その2… のように細かく繋げていくと期待通りのものになっていきやすかったのですが、
いっぺんに「カレントにこの名前のフォルダがなければこういう名前でフォルダを作成して、このスプレッドシートをこういう名前で作成したフォルダにコピーして、それを…」のように1回のチャットでお願いすると期待通りにならないことが多々ありました。
(もしかしたら人間側がきちんとした長文を書けていないだけかもしれませんが・・・)

モノや概念を知るには検索が一番だと思います。(慣れているだけかもしれませんが)
すくなくとも今のところChatGPTはしったかぶりするのできちんとした知識を知るには裏を取るためにググる必要があります。
ただ、コードに関しては革命だと感じました。
私みたいなコーディング弱者には滅茶苦茶ありがたいツールです。

GASだけでなくバッチやVBSからモダンなスクリプトまで生成してくれるので情シスとしては負担が減ります。ちょっとしたスクリプト書いて雑務自動化するというのはよくあるので。

ChatGPT、私としては歓迎な技術です。

コメント

タイトルとURLをコピーしました