commit bd4e9033e4062de9271f5de8a90976f861fb5a2b Author: Julian Freeman Date: Sun Dec 21 21:30:51 2025 -0400 init diff --git a/Code.gs b/Code.gs new file mode 100644 index 0000000..4d268de --- /dev/null +++ b/Code.gs @@ -0,0 +1,52 @@ +/** + * Web App 入口 + */ +function doGet() { + return HtmlService.createTemplateFromFile('index') + .evaluate() + .setTitle('安全列表Plus') + .addMetaTag('viewport', 'width=device-width, initial-scale=1') + .setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL); +} + +/** + * 一次性获取所有 Sheet 数据,减轻多次请求的负担 + */ +function getAllData() { + const ss = SpreadsheetApp.getActiveSpreadsheet(); + const sheets = ["Main", "CN", "EN", "ES"]; + const result = {}; + + sheets.forEach(name => { + const sheet = ss.getSheetByName(name); + if (sheet) { + result[name.toLowerCase()] = getRowsData(sheet); + } else { + result[name.toLowerCase()] = []; + } + }); + + return result; +} + +/** + * 辅助函数:将 Sheet 转为对象数组 + */ +function getRowsData(sheet) { + const data = sheet.getDataRange().getValues(); + if (data.length < 1) return []; + const headers = data[0]; + const rows = data.slice(1); + return rows.map(row => { + let obj = {}; + headers.forEach((header, i) => { + // 这里的处理是为了防止日期对象在传输时出错,转为 ISO 字符串 + let val = row[i]; + if (val instanceof Date) { + val = val.toISOString(); + } + obj[header] = val; + }); + return obj; + }); +} \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..c51f1d1 --- /dev/null +++ b/index.html @@ -0,0 +1,243 @@ + + + + + + + + + + + +
+ +
+
+

DIRECTORY

+

{{ ui[lang].subtitle }}

+
+ +
+
+ + 🔍 +
+ + + + +
+
+ +
+
+ {{ ui[lang].showing }}: {{ filteredItems.length }} +
+
{{ ui[lang].syncing }}
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
{{ ui[lang].colName }}{{ ui[lang].colType }}Platforms{{ ui[lang].colSafety }}{{ ui[lang].colDate }}Action
+
+
+ +
+
+
+
{{ item.name }}
+
{{ item.note || '--' }}
+
+
+
+ + {{ translateStatic(item.type) }} + + +
+ + {{ p }} + +
+
+
+ + {{ translateStatic(item.safety) }} +
+
+ {{ formatDate(item.date) }} + + + {{ ui[lang].linkBtn }} + + +
+
+ +
+
+

{{ ui[lang].syncing }}

+
+
+
NULL
+

{{ ui[lang].noResults }}

+
+
+
+ + + + \ No newline at end of file