通过自定义菜单从浏览器将 Google Sheet 数据下载为 JSON
Download Google Sheet data as JSON from browser through custom menu
有没有办法直接从 Google Sheet 下载 JSON,像这样:
我想使用应用脚本创建自定义菜单。将有一个按钮可以从 sheet 数据创建 JSON 对象,完成后会立即将其作为文件下载。
所以没有涉及 GDrive 或其他应用程序,只有一个 Google Sheet 和一个应用程序脚本。
这有可能吗?我找不到这样的东西。
我相信你的目标如下。
- 您想 运行 自定义菜单中的脚本。
- 您想将活动 sheet 下载为包含 JSON 数据的文件。
- 样本JSON数据如下。
[{"a1": "a2", "b1": "b2"},{"a1": "a3", "b1": "b3"},,,]
在这种情况下,为了下载文件,需要使用Javascript。为此,在此答案中,使用了一个对话框。所以这个示例脚本的流程如下
- 运行 自定义菜单中的脚本。
- 打开一个对话框。
- Javascript在对话框中是运行,文件已下载。
- 对话框关闭。
将上面的流程反映到一个脚本中,就变成了这样。
示例脚本:
请将以下脚本复制并粘贴到脚本编辑器,然后运行 onOpen
或重新打开 Spreadsheet。这样,自定义菜单就创建好了。
Google Apps 脚本端:Code.gs
请将以下脚本作为 Google Apps 脚本复制并粘贴到脚本编辑器中。
function onOpen() {
SpreadsheetApp.getUi().createMenu('Custom Menu').addItem('Export to JSON', 'download').addToUi();
}
function download() {
const html = HtmlService.createHtmlOutputFromFile("index");
SpreadsheetApp.getUi().showModalDialog(html, "sample");
}
function downloadFile() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const [header, ...values] = sheet.getDataRange().getValues();
const obj = values.map(r => r.reduce((o, c, j) => Object.assign(o, {[header[j]]: c}), {}));
const filename = `${sheet.getSheetName()}.txt`;
const blob = Utilities.newBlob(JSON.stringify(obj), MimeType.PLAIN_TEXT, filename);
return {data: `data:${MimeType.PLAIN_TEXT};base64,${Utilities.base64Encode(blob.getBytes())}`, filename: filename};
}
HTML&Javascript方:index.html
请将以下脚本复制并粘贴到脚本编辑器中作为 HTML。
<script>
google.script.run
.withSuccessHandler(({ data, filename }) => {
if (data && filename) {
const a = document.createElement("a");
document.body.appendChild(a);
a.download = filename;
a.href = data;
a.click();
}
google.script.host.close();
})
.downloadFile();
</script>
参考文献:
有没有办法直接从 Google Sheet 下载 JSON,像这样:
我想使用应用脚本创建自定义菜单。将有一个按钮可以从 sheet 数据创建 JSON 对象,完成后会立即将其作为文件下载。 所以没有涉及 GDrive 或其他应用程序,只有一个 Google Sheet 和一个应用程序脚本。
这有可能吗?我找不到这样的东西。
我相信你的目标如下。
- 您想 运行 自定义菜单中的脚本。
- 您想将活动 sheet 下载为包含 JSON 数据的文件。
- 样本JSON数据如下。
[{"a1": "a2", "b1": "b2"},{"a1": "a3", "b1": "b3"},,,]
在这种情况下,为了下载文件,需要使用Javascript。为此,在此答案中,使用了一个对话框。所以这个示例脚本的流程如下
- 运行 自定义菜单中的脚本。
- 打开一个对话框。
- Javascript在对话框中是运行,文件已下载。
- 对话框关闭。
将上面的流程反映到一个脚本中,就变成了这样。
示例脚本:
请将以下脚本复制并粘贴到脚本编辑器,然后运行 onOpen
或重新打开 Spreadsheet。这样,自定义菜单就创建好了。
Google Apps 脚本端:Code.gs
请将以下脚本作为 Google Apps 脚本复制并粘贴到脚本编辑器中。
function onOpen() {
SpreadsheetApp.getUi().createMenu('Custom Menu').addItem('Export to JSON', 'download').addToUi();
}
function download() {
const html = HtmlService.createHtmlOutputFromFile("index");
SpreadsheetApp.getUi().showModalDialog(html, "sample");
}
function downloadFile() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const [header, ...values] = sheet.getDataRange().getValues();
const obj = values.map(r => r.reduce((o, c, j) => Object.assign(o, {[header[j]]: c}), {}));
const filename = `${sheet.getSheetName()}.txt`;
const blob = Utilities.newBlob(JSON.stringify(obj), MimeType.PLAIN_TEXT, filename);
return {data: `data:${MimeType.PLAIN_TEXT};base64,${Utilities.base64Encode(blob.getBytes())}`, filename: filename};
}
HTML&Javascript方:index.html
请将以下脚本复制并粘贴到脚本编辑器中作为 HTML。
<script>
google.script.run
.withSuccessHandler(({ data, filename }) => {
if (data && filename) {
const a = document.createElement("a");
document.body.appendChild(a);
a.download = filename;
a.href = data;
a.click();
}
google.script.host.close();
})
.downloadFile();
</script>