โค้ด Appscript สำหรับแสดงรายการไฟล์ต่างๆที่อัพโหลดใน google drive บน google sheet
// ===============================================
// Drive → Sheet file lister with Preview (fit to cell) & menu
// ===============================================
// (ใส่หรือปล่อยว่างก็ได้ — ไปตั้งในเมนูภายหลัง)
const DEFAULT_FOLDER_ID = ''; // เช่น '1mA2do3tc047nzTwbVyaKABllQAkLIUHy'
const PROP_KEY = 'DRIVE_FOLDER_ID';
const TZ = 'Asia/Bangkok';
// ขนาดเซลล์สำหรับพรีวิวรูป (โหมด 1 จะย่อ/ขยายให้พอดีเซลล์)
const PREVIEW_COL_WIDTH = 140; // ความกว้างคอลัมน์ Preview (px)
const PREVIEW_ROW_HEIGHT = 120; // ความสูงแถวข้อมูล (px)
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('Drive Tools')
.addItem('Set Folder ID…', 'setFolderIdPrompt')
.addItem('List Files (ชั้นเดียว)', 'listFilesInFolder')
.addSeparator()
.addItem('List Files (รวมใน subfolders)', 'listFilesRecursively')
.addToUi();
const props = PropertiesService.getDocumentProperties();
if (!props.getProperty(PROP_KEY) && DEFAULT_FOLDER_ID) {
props.setProperty(PROP_KEY, DEFAULT_FOLDER_ID);
}
}
/** ตั้ง/แก้ Folder ID ผ่านกล่องโต้ตอบ */
function setFolderIdPrompt() {
const props = PropertiesService.getDocumentProperties();
const ui = SpreadsheetApp.getUi();
const res = ui.prompt(
'Set Folder ID',
'ใส่ Google Drive Folder ID (ส่วนท้ายของ URL หลัง /folders/ ):',
ui.ButtonSet.OK_CANCEL
);
if (res.getSelectedButton() !== ui.Button.OK) return;
const id = (res.getResponseText() || '').trim();
if (!id) return ui.alert('ยังไม่ใส่ค่า');
try {
DriveApp.getFolderById(id); // ตรวจสิทธิ์/ความถูกต้อง
} catch (e) {
return ui.alert('Folder ID ไม่ถูกต้อง หรือไม่มีสิทธิ์เข้าถึง');
}
props.setProperty(PROP_KEY, id);
ui.alert('บันทึก Folder ID เรียบร้อย');
}
/** ดึงไฟล์เฉพาะในโฟลเดอร์ (ไม่ลง subfolders) */
function listFilesInFolder() {
const folder = getTargetFolder_();
const files = folder.getFiles();
const sheet = prepareSheet_();
let row = 2, no = 1;
while (files.hasNext()) {
writeRow_(sheet, row++, no++, files.next());
}
finalizeFormatting_(sheet, row);
}
/** ดึงไฟล์รวมทุก subfolders (DFS) */
function listFilesRecursively() {
const startFolder = getTargetFolder_();
const sheet = prepareSheet_();
let row = 2, no = 1;
const stack = [startFolder];
while (stack.length) {
const cur = stack.pop();
const files = cur.getFiles();
while (files.hasNext()) writeRow_(sheet, row++, no++, files.next());
const subs = cur.getFolders();
while (subs.hasNext()) stack.push(subs.next());
}
finalizeFormatting_(sheet, row);
}
// -------------------- helpers --------------------
function getTargetFolder_() {
const props = PropertiesService.getDocumentProperties();
const id = props.getProperty(PROP_KEY) || DEFAULT_FOLDER_ID;
if (!id) throw new Error('ยังไม่ได้ตั้งค่า Folder ID (ใช้เมนู Drive Tools → Set Folder ID…)');
return DriveApp.getFolderById(id);
}
function prepareSheet_() {
const sheet = SpreadsheetApp.getActiveSheet();
sheet.clear();
const header = [['No.', 'File Name', 'Preview', 'URL', 'Type', 'Size', 'Last Modified']];
sheet.getRange(1, 1, 1, header[0].length).setValues(header).setFontWeight('bold');
// ปรับความกว้างคอลัมน์
sheet.setColumnWidths(1, 1, 60); // No.
sheet.setColumnWidths(2, 1, 320); // File Name
sheet.setColumnWidths(3, 1, PREVIEW_COL_WIDTH); // Preview
sheet.setColumnWidths(4, 1, 420); // URL
sheet.setColumnWidths(5, 1, 180); // Type
sheet.setColumnWidths(6, 1, 120); // Size
sheet.setColumnWidths(7, 1, 180); // Last Modified
// ตั้งความสูงแถวหัวตาราง
sheet.setRowHeight(1, 28);
return sheet;
}
function writeRow_(sheet, row, no, file) {
const id = file.getId();
const name = file.getName();
const url = file.getUrl();
const mime = file.getMimeType();
const sizeBytes = safeGetSize_(file, mime);
const sizeDisplay = sizeBytes === null ? '—' : humanFileSize_(sizeBytes);
const lastUpdated = Utilities.formatDate(file.getLastUpdated(), TZ, 'yyyy-MM-dd HH:mm');
const SEP = getArgSeparator_();
// ---- Preview ให้พอดีกับเซลล์: ใช้ IMAGE(url, 1) ----
let previewFormula = '';
if (mime && mime.startsWith('image/')) {
// รูปภาพจริง
previewFormula = `=IMAGE(${quote_(`https://drive.google.com/uc?export=view&id=${id}`)}${SEP}1)`;
} else if (mime === 'application/pdf') {
// PDF: ลองใช้ thumbnail ของ Drive (อาจไม่ขึ้นเสมอไป)
previewFormula = `=IMAGE(${quote_(`https://drive.google.com/thumbnail?id=${id}`)}${SEP}1)`;
} else {
previewFormula = ''; // ไฟล์อื่นไม่แสดง preview
}
sheet.getRange(row, 1, 1, 4).setValues([[no, name, previewFormula, url]]);
sheet.getRange(row, 5, 1, 3).setValues([[mime, sizeDisplay, lastUpdated]]);
}
function finalizeFormatting_(sheet, lastRow) {
const height = Math.max(1, lastRow - 1);
sheet.getRange(1, 1, height, 7).createBorder(true, true, true, true, true, true);
if (lastRow > 2) {
const dataRows = lastRow - 2;
// จัดเลขลำดับให้อยู่กลาง
sheet.getRange(2, 1, dataRows, 1).setHorizontalAlignment('center');
// จัด Preview ให้อยู่กลางแนวนอน/ตั้ง
sheet.getRange(2, 3, dataRows, 1).setHorizontalAlignment('center').setVerticalAlignment('middle');
// ตั้งความสูงแถวข้อมูลทั้งหมดให้เท่ากัน (พอดีกับรูป)
sheet.setRowHeights(2, dataRows, PREVIEW_ROW_HEIGHT);
}
}
// ---------- utilities ----------
/** คืน size เป็น bytes; ไฟล์ Google เนทีฟ (Docs/Sheets/Slides) มักเป็น 0 → คืน null เพื่อแสดง '—' */
function safeGetSize_(file, mime) {
try {
const bytes = file.getSize();
if (!bytes || bytes < 0) return null;
return bytes;
} catch (e) {
return null;
}
}
function humanFileSize_(bytes) {
const thresh = 1024;
if (bytes < thresh) return bytes + ' B';
const units = ['KB', 'MB', 'GB', 'TB'];
let u = -1;
do {
bytes /= thresh;
++u;
} while (bytes >= thresh && u < units.length - 1);
return bytes.toFixed(2) + ' ' + units[u];
}
/** เลือกตัวคั่นอาร์กิวเมนต์สูตรตามโลแคลของชีต (บางโลแคลใช้ ; แทน ,) */
function getArgSeparator_() {
const locale = SpreadsheetApp.getActive().getSpreadsheetLocale() || '';
const semicolonLangs = ['de', 'fr', 'it', 'es', 'pt', 'pl', 'nl', 'tr', 'ru', 'uk', 'cs', 'da', 'fi', 'sv', 'no', 'hu', 'ro', 'sk', 'sl', 'el', 'lv', 'lt', 'et'];
const lang = locale.split('_')[0].toLowerCase();
return semicolonLangs.includes(lang) ? ';' : ',';
}
/** ครอบสตริงเป็น "..." และ escape " ภายใน */
function quote_(s) {
return `"${String(s).replace(/"/g, '""')}"`;
}