【GAS、Google Spreadsheet】ブログに使用した画像をGoogleドライブで管理するために書いたスクリプト

Code

はじまり

135ml
135ml

今回は、このブログで使用した画像を管理するために書いたスクリプトを紹介するよ。

リサちゃん
リサちゃん

管理って、Googleドライブでやってるんだっけ?

135ml
135ml

そうそう、だから今回紹介するスクリプトはGoogle Apps Scriptになります。

それでは、いきます!

ツールの概要

このツールは、ブログの記事を管理する台帳を元に動きます。

既に公開した記事(F列が”済”になっている記事)で使用した画像を、Googleドライブの所定のフォルダに保存していて、その画像を完了済みのフォルダに移動します。

ツールを動かす前のGoogleドライブの状況がこんな感じで、動かすと「20211123_Eyecatch.jpgのコピー」と「20211205_02.jpgのコピー」の画像ファイルが動きます。

そして、ツールを動かすと、このようにファイルが動きます。

ちゃんと、目当ての年月の完了フォルダに移動しています。

そして、タイマーを設定して、定期的に動くようにしました。

ツールのソース

以下がソースになります。manageFilesGoogleDrive()を動かします。

コード.gs

function moveFileToFolder(postedList) {
  // declare for prepare.
  var alreadyPostedList = [], alreadyPostedChr = '済';

  // get list of aticle already posted.
  postedList.forEach(function(value) {
    if(value[1] == alreadyPostedChr) {
      alreadyPostedList.push(value[0]);
    }
  });
  
  // declare for get list of folders.
  var folder_id = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', // Folder ID of image for article.
    folder,
    folders,
    folder_now,
    key_date_folder,
    folderDict = {},
    prefix_folder = "◆完了分_", // prefix of folder of image for article already posted.
    date_format_8   = "yyyyMMdd",
    date_format_6   = "yyyyMM";

  // get list of folders.
  folder = DriveApp.getFolderById(folder_id);
  folders = folder.getFolders();
  while(folders.hasNext()) {
    folder_now = folders.next();
    if (prefix_folder == folder_now.getName().substring(0, prefix_folder.length)) {
      key_date_folder = folder_now.getName().substring(prefix_folder.length, prefix_folder.length + date_format_6.length);
      folderDict[key_date_folder] = folder_now.getId();
    }
  }

  // declare for get list of image files.
  var files,
    file,
    key_date_file_6,
    key_date_file_8,
    fileList = [];

  // get list of image files.
  files = folder.getFiles();
  while(files.hasNext()) {
    file = files.next();
    key_date_file_6 = file.getName().substring(0, date_format_6.length);
    key_date_file_8 = file.getName().substring(0, date_format_8.length);
    
    if (alreadyPostedList.find(key => key === key_date_file_8) != null) {
      fileList.push([key_date_file_8, key_date_file_6, file.getId()]);
    }
  }
  console.log(fileList);

  // declare for move file to folder
  var targetFile, toFolder;

  // move file to folder
  fileList.forEach(function(movingList) {
    if (movingList[1] != "") {
      targetFile = DriveApp.getFileById(movingList[2]);
      toFolder   = DriveApp.getFolderById(folderDict[movingList[1]]);
      targetFile.moveTo(toFolder);
    }
  });

}

function readGssColumns() {
  // declare for prepare.
  var ss,
    sheetName = 'ブログ_記事',
    sheet,
    postedNumber,
    row_for_postedNumber = 6,
    column_for_postedNumber = 13;
  ss = SpreadsheetApp.getActive();
  sheet = ss.getSheetByName(sheetName);
  postedNumber = Number(sheet.getRange(row_for_postedNumber, column_for_postedNumber).getValue());
  
  // declare for get list from GSS.
  var dateList   = [],
    dateList_formated = [],
    postedList = [],
    i = 2, // index of row to start reading sheet.
    column_for_date   = 3, // index of 「起票日」column.
    column_for_posted = 6, // index og 「投稿済」column.
    returnList = [];
  
  // get dateList and cleansing.
  dateList   = sheet.getRange(i, column_for_date, postedNumber, 1).getValues();
  for (let j = 0; j < postedNumber; j++) {
    dateList_formated.push(Utilities.formatDate(dateList[j][0], 'JST', 'yyyyMMdd'));
  }

  // get postedList.
  postedList = sheet.getRange(i, column_for_posted, postedNumber, 1).getValues();

  // create returnList
  for (let k = 0; k < postedNumber; k++) {
    returnList.push([dateList_formated[k], postedList[k][0]]);
  }

  return returnList;
}

function manageFilesGoogleDrive() {
  // declare for execute.
  var postedList;
  postedList = readGssColumns();
  moveFileToFolder(postedList);
}

苦労した点

作る時に最も引っかかった部分が、getValues()の部分ですね・・・

// get dateList and cleansing.
  dateList   = sheet.getRange(i, column_for_date, postedNumber, 1).getValues();
  for (let j = 0; j < postedNumber; j++) {
    dateList_formated.push(Utilities.formatDate(dateList[j][0], 'JST', 'yyyyMMdd'));
  }

このgetValue()で、僕は1列しか指定していないのに、それで取得した値が配列で入っていたんですよね。

それが原因で、Utilities.formatDate(dateList[j][0], 'JST', 'yyyyMMdd')で、「dateList[j][0]がNumber[]で型が違うよ。」というエラーメッセージを出されて、「俺はNumberなんて取得した覚えはないぞ!(# ゚Д゚)ウガアアアア」と、ムカつきながら長時間原因を探していました・・・。

インデックス1つ分でも配列で取ってきます・・・。同じようなバグに当たったら、みなさんも気をつけてくださいね・・・。

おしまい

リサちゃん
リサちゃん

配列の間違いって、けっこうハマるポイントだから、慣れが必要だよねえ・・・

135ml
135ml

そうなのよ、長さ1の配列の中にまた長さ1の配列が入っていて何のことやらって感じで、

こればかりは、ちゃんとデバッグログを仕込んでも見逃す時は見逃しちゃうよね。

おしまい

ペンギン
ペンギン

今回紹介したスクリプトが入っているリポジトリがここになります。

https://github.com/landmaster135/spread-sprite-spring/tree/master/20211119_kinkinbeer135ml_sheet

以上になります!

コメント

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