有没有办法将操作按钮从一个 Google 工作表文件复制到另一个工作表文件?
Is there a way to duplicate an action button from one Google sheets file to another?
TL;DR:我正在寻找一种使用现有 google 脚本向云端硬盘文件夹中所有未来添加的文件添加操作按钮的方法。
大家好,
我有一个 Google-apps 脚本,用于检查 Google Drive 文件夹中文件数的变化,并在发生变化时将某个脚本应用于它(所有脚本都在同一个项目中,所有文件格式相同)。
我决定要在其中一张工作表中添加一个操作按钮,以根据用户的请求应用特定的过滤器。
我正在寻找一种方法将此操作按钮添加到所有未来添加的文件中。
我想到了下一个可能的实现:
- 使用脚本创建绘图 - 我找不到生成新绘图的方法。
- 使特定范围可点击 - 也找不到这样做的方法
- 向文件的工具栏添加菜单 - 我抛出一个异常,无法从当前上下文中调用
SpreadsheetApp.newMenu()
。
是否有人实现了类似的东西并且可以提供帮助?
谢谢!
至于菜单,你可以试试这个:
function onOpen() { //[OPTIONAL] Created a custom menu "Timestamp" on your Spreadsheet, where you can run the script
var ui = SpreadsheetApp.getUi();
// Or DocumentApp or FormApp.
ui.createMenu('Whatever you want it to be called') //keep the ''
.addItem('Function Description', 'function call') //for the function, don't use ()
.addSubMenu(ui.createMenu('submenu name') //only if needed
.addItem('Function Description','function call')
.addSeparator() //aestethics only
.addItem('Function Description','function call')
.addToUi();
}
即时工具栏
这里有几个函数可以让您构建一个边栏,让您可以即时访问各种 html 控件,包括可以通过 google.script.run 调用任何服务器端函数的按钮。
第一个函数启动边栏,它提供对各种工具的即时访问,这些工具可以使用 html 创建。
function launchSideBarButtons() {
const ss = SpreadsheetApp.getActive();
let html = '<html><head><style>input {margin: 2px 5px 1px 0;}</style></head><body>';
html += '<input type="text" id="txt1" placeholder="Enter Folder Id" value="folderid" />';//Change the folderid to the default folder that you wish to check on enter a new folder id at the time just prior to execution
html += '<br><input type= "text" id="txt2" placeholder="Display Number Files" readonly />';
html += '<br><input type="button" value="Check Folder" onClick="checkFolder();" />';
html += '<script>';
html += 'function checkFolder() { let id=document.getElementById("txt1").value;google.script.run.withSuccessHandler(function(l){document.getElementById("txt2").value=l;}).checkMyFolder(id);}';
html += 'console.log("My Code")';
html += '</script></body></html>';
SpreadsheetApp.getUi().showSidebar(HtmlService.createHtmlOutput(html).setTitle("Instant Tool Bar"));
}
该函数是服务器端函数,实际打开文件夹并统计文件数。
function checkMyFolder(id) {
const folder = DriveApp.getFolderById(id);
if (folder) {
const files = folder.getFiles();
let n = 0;
while (files.hasNext()) {
let file = files.next();
n++;
}
return n;
} else {SpreadsheetApp.getUi().alert("Check folder id")}
}
此函数创建一个可安装的 onMyNewOpen() 触发器,它会在电子表格打开时启动侧边栏,这样您就不必为了单击按钮而必须浏览菜单。它的设置是无论你运行多少次它都只会创建一个触发器。
function onMyNewOpen() {
if (ScriptApp.getProjectTriggers().filter(t => t.getHandlerFunction() == "launchSideBarButtons").length == 0) {
ScriptApp.newTrigger("launchSideBarButtons").forSpreadsheet(SpreadsheetApp.getActive()).onOpen().create();
}
}
对话:
TL;DR:我正在寻找一种使用现有 google 脚本向云端硬盘文件夹中所有未来添加的文件添加操作按钮的方法。
大家好,
我有一个 Google-apps 脚本,用于检查 Google Drive 文件夹中文件数的变化,并在发生变化时将某个脚本应用于它(所有脚本都在同一个项目中,所有文件格式相同)。
我决定要在其中一张工作表中添加一个操作按钮,以根据用户的请求应用特定的过滤器。
我正在寻找一种方法将此操作按钮添加到所有未来添加的文件中。 我想到了下一个可能的实现:
- 使用脚本创建绘图 - 我找不到生成新绘图的方法。
- 使特定范围可点击 - 也找不到这样做的方法
- 向文件的工具栏添加菜单 - 我抛出一个异常,无法从当前上下文中调用
SpreadsheetApp.newMenu()
。
是否有人实现了类似的东西并且可以提供帮助?
谢谢!
至于菜单,你可以试试这个:
function onOpen() { //[OPTIONAL] Created a custom menu "Timestamp" on your Spreadsheet, where you can run the script
var ui = SpreadsheetApp.getUi();
// Or DocumentApp or FormApp.
ui.createMenu('Whatever you want it to be called') //keep the ''
.addItem('Function Description', 'function call') //for the function, don't use ()
.addSubMenu(ui.createMenu('submenu name') //only if needed
.addItem('Function Description','function call')
.addSeparator() //aestethics only
.addItem('Function Description','function call')
.addToUi();
}
即时工具栏
这里有几个函数可以让您构建一个边栏,让您可以即时访问各种 html 控件,包括可以通过 google.script.run 调用任何服务器端函数的按钮。
第一个函数启动边栏,它提供对各种工具的即时访问,这些工具可以使用 html 创建。
function launchSideBarButtons() {
const ss = SpreadsheetApp.getActive();
let html = '<html><head><style>input {margin: 2px 5px 1px 0;}</style></head><body>';
html += '<input type="text" id="txt1" placeholder="Enter Folder Id" value="folderid" />';//Change the folderid to the default folder that you wish to check on enter a new folder id at the time just prior to execution
html += '<br><input type= "text" id="txt2" placeholder="Display Number Files" readonly />';
html += '<br><input type="button" value="Check Folder" onClick="checkFolder();" />';
html += '<script>';
html += 'function checkFolder() { let id=document.getElementById("txt1").value;google.script.run.withSuccessHandler(function(l){document.getElementById("txt2").value=l;}).checkMyFolder(id);}';
html += 'console.log("My Code")';
html += '</script></body></html>';
SpreadsheetApp.getUi().showSidebar(HtmlService.createHtmlOutput(html).setTitle("Instant Tool Bar"));
}
该函数是服务器端函数,实际打开文件夹并统计文件数。
function checkMyFolder(id) {
const folder = DriveApp.getFolderById(id);
if (folder) {
const files = folder.getFiles();
let n = 0;
while (files.hasNext()) {
let file = files.next();
n++;
}
return n;
} else {SpreadsheetApp.getUi().alert("Check folder id")}
}
此函数创建一个可安装的 onMyNewOpen() 触发器,它会在电子表格打开时启动侧边栏,这样您就不必为了单击按钮而必须浏览菜单。它的设置是无论你运行多少次它都只会创建一个触发器。
function onMyNewOpen() {
if (ScriptApp.getProjectTriggers().filter(t => t.getHandlerFunction() == "launchSideBarButtons").length == 0) {
ScriptApp.newTrigger("launchSideBarButtons").forSpreadsheet(SpreadsheetApp.getActive()).onOpen().create();
}
}
对话: