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

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

はじまり#

135ml avatar
135ml
今回は、このブログで使用した画像を管理するために書いたスクリプトを紹介するよ。
リサちゃん avatar
リサちゃん
Google Drive.

ツールの概要#

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

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

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

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

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

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

ツールのソース#

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

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つ分でも配列で取ってきます・・・。同じようなバグに当たったら、みなさんも気をつけてくださいね・・・。

おしまい#

リサちゃん avatar
リサちゃん
配列の間違いって、けっこうハマるんだよなぁ・・・
135ml avatar
135ml
デバッグログを仕込んでも見逃す時は見逃しちゃようね。
ペンギン avatar
ペンギン
オレでなきゃ見逃しちゃうね。

以上になります!

記事を共有

この記事が役に立ったなら、ぜひ他の人と共有してください!

【GAS、Google Spreadsheet】ブログに使用した画像をGoogleドライブで管理するために書いたスクリプト
https://endorphinbath.com/posts/gas-manage-images-googledrive/
著者
kinkinbeer135ml
公開日
2022-04-03
ライセンス
CC BY-NC-SA 4.0
関連記事 スマート
1
【GAS、Google Spreadsheet】Googleドライブのフォルダに有るファイルを一覧で取得するスクリプトです
Code GoogleDriveの指定のフォルダにあるファイルを一覧で取得します。Googleドライブを整理したい時に役立つツールになるかと思います。
2
【GAS、Google Spreadsheet】Googleドライブのルートフォルダに有るフォルダを一覧で取得するスクリプトです
Code GoogleDriveのルートフォルダにあるフォルダを一覧で取得します。Googleドライブを整理したい時に役立つツールになるかと思います。
3
【GAS、Google Spreadsheet】Googleドライブ内の指定したフォルダに所定のファイルをコピーするスクリプトです
Code GoogleDriveの指定のフォルダにファイルをコピーするツールを作りました。何かWebの記事をGoogleドキュメントにクリップしたり、指定のフォルダにメモ書きやシートを作成したい場合に役立つかと思います。
4
【GAS、Google Spreadsheet】自分がブログで書いた記事のURLからスクレイピングしてドキュメントに出力する
Code 下書きを書かずに投稿してしまったブログの記事をスクレイピングして、Googleドライブ上に出力するツールを作りました。スクレイピングにエラーにならずに失敗した時のログを出力する処理も施しています。
5
【GAS、Google Spreadsheet】自分がブログで書いた記事のURLからスクレイピングしてドキュメントに出力する
Code 下書きを書かずに投稿してしまったブログの記事をスクレイピングして、Googleドライブ上に出力するツールを作りました。スクレイピングにエラーにならずに失敗した時のログを出力する処理も施しています。
ランダム記事 ランダム
Profile Image of the Author
kinkinbeer135ml
SIerをやめて、プログラミングを勉強しています。※Amazonアソシエイトに参加しています。
お知らせ
私のブログへようこそ!これはサンプルのお知らせです。
音楽
カバー

音楽

再生中なし

0:00 0:00
歌詞なし
カテゴリ
タグ
サイト統計
記事
287
カテゴリー
8
タグ
93
総文字数
486,174
運用日数
0
最終活動
0 日前

目次