GASを使用してスプレッドシート内のURLから短縮URLとQRコード作成
解決したいこと
Googleドライブ内のフォルダ(元画像)に入っている画像のURLを取得し、
X.gdのAPIを使用して短縮URLに変換。
その後QR code APIを使用して短縮URLからQRコードを作成するGASを作成しました。
先に短縮URLをスプレッドシート内のセルの値に入力し、その値を読み取ってから
QRコード作成をしているつもりなのですが、先にQRコードを作成しようとするため
読み取っても値が空のQRコードが作成されてしまいます。
先に作成している(はずの)短縮URLの値をQR code APIに渡すにはどこを見直したら
よろしいですか。
該当するソースコード
// 初期設定
// 元画像が入っているフォルダIDを入力
var oldFolderID = 'ここに入力';
var oldFolder = DriveApp.getFolderById(oldFolderID);
// 作成されたQRコードを出力するフォルダIDを入力
var QRFolderID = 'ここに入力';
var QRFolder = DriveApp.getFolderById(QRFolderID);
// X.gdのAPIから短縮URLを作成するためのAPIキーを入力
var apiKey = 'ここに入力';
// 初期設定ここまで
function makeQR_shortenURL() {
// 元画像フォルダ内のファイル名とURLを取得して、スプシに出力させる
// スプレッドシートとシートの指定
var activeSpreadSheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = activeSpreadSheet.getSheetByName('QRコード作成用'); // 必要に応じて変更します
// シートをクリア
sheet.clear();
// シートのタイトル行を設定
sheet.appendRow(['', 'ファイル名', '拡張子なし', 'GoogleドライブでのURL', '短縮URL']);
// フォルダ内のファイルを取得
var files = oldFolder.getFiles();
// ファイル名、拡張子なし、Googleドライブ上のURL、短縮URLを変数に代入
while (files.hasNext()) {
var file = files.next();
var fileName = file.getName();
var kakuNashi = fileName.substring(0, fileName.length -4);
var fileUrl = file.getUrl();
var shortURL = shortenUrlWithXgd(fileUrl, apiKey);
// ファイル名、拡張子なし、Googleドライブ上のURL、短縮URLをスプシに出力
sheet.appendRow([, fileName, kakuNashi, fileUrl, shortURL]);
}
}
// Googleドライブ上のURLから短縮URLを作成
// スプシから元のURLを取得して短縮URLを出力
var activeSpreadSheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = activeSpreadSheet.getSheetByName('QRコード作成用'); // 必要に応じて変更します
var lastRow = sheet.getLastRow();
for (var i = 2; i <= lastRow; i++) {
// 元のURLがD列に入っている場合
var longUrl = sheet.getRange(i, 4).getValue();
// E列に既に短縮URLがあるか確認
var existingShortUrl = sheet.getRange(i, 5).getValue();
// E列が空で、D列にURLがある場合のみ短縮URLを生成
if (longUrl && !existingShortUrl) {
var shortUrl = shortenUrlWithXgd(longUrl, apiKey);
// E列に短縮URLを表示
sheet.getRange(i, 5).setValue(shortUrl);
}
}
function shortenUrlWithXgd(longUrl, apiKey) {
// X.gdのAPIを使用するためのurl設定
var url = "https://xgd.io/V1/shorten?url=" + encodeURIComponent(longUrl) + "&key=" + apiKey;
var options = {
method: "GET",
muteHttpExceptions: true
};
var response = UrlFetchApp.fetch(url, options);
//短縮化するURLが多いとサーバーの処理が間に合わないため1000ms待ってから
Utilities.sleep(1000);
// 正常に処理が行われなかった場合
if (response.getResponseCode() !== 200) {
Logger.log("Error: " + response.getContentText());
throw new Error("Failed to shorten URL. Status code: " + response.getResponseCode());
}
var data = JSON.parse(response.getContentText());
Logger.log("Shortened URL: " + data.shorturl); // 短縮URLをログに出力
return data.shorturl; // 短縮URLを返します
}
// URLからQRコード作成
//スプレッドシートからデータを取得
var ss = SpreadsheetApp.getActiveSpreadsheet();
var rows = sheet.getLastRow()-1; //1行目はカラム行のため-1
var datas = sheet.getRange(2,2,rows,4).getValues();
//スプレッドシートの各行に対して繰り返し
datas.forEach(function(data){
//各項目を抜き出し(先頭列は0)
var url = data[3];
var name = data[1];
//QR code APIを使用して上で取得したURLのQRコードを生成
var qr_url = "https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=" + url;
//fetchする際のoptionを宣言
var option = {
method:"get"
}
//fetch
var response = UrlFetchApp.fetch(qr_url,option);
//fetchのレスポンスデータをblobとして取得
var blob = response.getBlob();
//指定フォルダにQRコードの画像を格納
var file = QRFolder.createFile(blob);
//ファイル名を変更
file.setName(name + ".png");
});
### 自分で試したこと