请求修改Google Sheets App Script:用A列数据命名QR码PNG文件
解决Google Sheets脚本生成QR码时用A列数据命名文件的问题
问题说明
现有Google Apps Script可生成QR码并保存到指定Drive文件夹,但生成的PNG文件以"Row 2""Row 3"命名,需要修改为使用对应行A列的数据作为文件名。原代码如下:
function myFunction() { var sheetName = "QR CODE DATA"; // Sheet name var folderId = "FOLDER NAME"; // Folder ID var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName(sheetName); var url = "https://api.qrserver.com/v1/create-qr-code/?size=120x120&data="; var keys = ["-Tipo:", "-Ubicación:", "-# registro:", "-ID-C:", "-# Serial:", "-Pas:", "-Di I:", "-Asi:", "-RP:", "-Ar:"]; var values = sheet.getRange(2, 2, sheet.getLastRow() - 1, 11).getValues() .filter(function(e) {return e.some(function(f) {return f})}) .map(function(row) { row.splice(4, 1); return row; }); var length = values.length; var reqs = values.map(function(e) {return {url: url + encodeURIComponent(keys.map(function(f, j) {return f + e[j]}).join("\r"))}}); var res = UrlFetchApp.fetchAll(reqs); res.forEach(function(r, i) { var blob = r.getBlob().setName(length == values.length ? "row" + (i + 2) + ".png" : "row" + (length + 1) + ".png"); DriveApp.getFolderById(folderId).createFile(blob); }); }
修改后的代码
function myFunction() { var sheetName = "QR CODE DATA"; // Sheet name var folderId = "FOLDER NAME"; // Folder ID var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName(sheetName); var url = "https://api.qrserver.com/v1/create-qr-code/?size=120x120&data="; var keys = ["-Tipo:", "-Ubicación:", "-# registro:", "-ID-C:", "-# Serial:", "-Pas:", "-Di I:", "-Asi:", "-RP:", "-Ar:"]; // 调整范围,同时获取A列(第1列)的文件名和B到L列(第2到12列)的QR数据 var allData = sheet.getRange(2, 1, sheet.getLastRow() - 1, 12).getValues() .filter(function(row) { // 过滤掉A列空值或QR数据全空的行 return row[0] && row.slice(1).some(function(cell) {return cell}); }) .map(function(row) { // 保留A列文件名,同时对QR数据部分执行原有的splice操作 var fileName = row[0]; var qrData = row.slice(1); qrData.splice(4, 1); return {fileName: fileName, qrData: qrData}; }); var reqs = allData.map(function(item) { return { url: url + encodeURIComponent(keys.map(function(f, j) { return f + item.qrData[j] }).join("\r")) }; }); var res = UrlFetchApp.fetchAll(reqs); res.forEach(function(r, i) { // 使用对应行A列的文件名,确保后缀为.png var fileName = allData[i].fileName.trim() + ".png"; var blob = r.getBlob().setName(fileName); DriveApp.getFolderById(folderId).createFile(blob); }); }
关键修改点
- 数据范围调整:将
getRange的起始列从2改为1,列数从11改为12,同时获取A列的文件名和后续的QR码数据 - 数据结构重构:通过
map将每行数据拆分为fileName(A列值)和qrData(处理后的QR内容),方便后续调用 - 过滤逻辑优化:过滤时同时检查A列是否有值,避免生成无意义文件名的文件
- 文件名替换:在创建Blob时直接使用
allData[i].fileName作为文件名,替换原有的"rowX"命名规则
内容的提问来源于stack exchange,提问作者Jon Bunce
相关产品推荐
相关产品推荐

