Google apps script 如何允许webapp在DriveApp中创建文件
我有一组受保护的电子表格文件,两个用户可以访问这些文件。它们中的每一个都有一个脚本,该脚本使用一个库中的函数来触发web应用程序(允许用户以管理员身份运行函数) 我想让用户可以选择创建给定电子表格文件的副本。现在,如果用户使用“文件”->“创建副本”,则:Google apps script 如何允许webapp在DriveApp中创建文件,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我有一组受保护的电子表格文件,两个用户可以访问这些文件。它们中的每一个都有一个脚本,该脚本使用一个库中的函数来触发web应用程序(允许用户以管理员身份运行函数) 我想让用户可以选择创建给定电子表格文件的副本。现在,如果用户使用“文件”->“创建副本”,则: 成为文件的所有者(管理员必须是所有者!),用户必须手动更改它 用户上的保护已关闭-管理员必须手动更改 我已决定将代码添加到在管理员帐户上运行的webapp: DriveApp.getFileById(fileId).makeCopy();
DriveApp.getFileById(fileId).makeCopy();
这样,文件的副本将从管理员帐户生成。这意味着管理员将是文件的所有者,保护将对用户起作用
不幸的是,我得到了一个错误:
例外:Nie masz uprawnień,aby wywołać:DriveApp.getFileById。Wymagane Uprawnieria:(| |)
我知道该web应用程序无法访问google drive。
是否可以仅允许此web应用在驱动器中创建新文件
或者用户是否有其他方法(没有webapp)来创建文件副本并实现自动化:对用户启用保护并更改文件所有者
In webapp File -> Proterties -> Scopes I have found:
function stworzKopiePliku(){
Kosztoryslibrary.stworzKopiePliku();
}
库中的脚本:
var url = "...";
function stworzKopiePliku(url){
stworzKopieP(url);
}
function stworzKopieP() {
var urlScript = SpreadsheetApp.getActiveSpreadsheet().getUrl();
var fileId = SpreadsheetApp.getActiveSpreadsheet().getId();
var type = "stworzKopiePliku";
var urlParam = (url+"?urlScript="+urlScript+"&type="+type+"&fileId="+fileId);
var html = "<script>window.open('" + urlParam + "');google.script.host.close();</script>";
var userInterface = HtmlService.createHtmlOutput(html);
SpreadsheetApp.getUi().showModalDialog(userInterface, "skrypt w trakcie działania...");
}
}
我在许多其他函数中使用了非常类似的代码,并且所有代码都正常工作。唯一的问题似乎是webapp无法访问google drive来创建文件。单击“查看”菜单并选择“显示清单文件”,文件“appsscript.json”将在代码编辑器中打开。如果您没有看到
“oauthScopes”:[scope here]
,那么这些作用域是在内部处理的。您可以在“appsscript.json”(清单)文件中显式设置应用程序脚本项目将使用的作用域。当您运行某些代码时,代码会检查授权的作用域,并在需要时提示您授权新的作用域。您的appsscript.json文件是否设置了“oauthScopes”:[scope here]
?在appsscript.json中,我只找到了:{“时区”:“Europe/Paris”,“dependencies”:{},“webapp”:{“access”:“ANONYMOUS”,“executeAs”:“USER\u Deployment”},“exceptionLogging”:“STACKDRIVER”,“runtimeVersion”:“V8”}
您的用户需要授权web应用。直接运行任何函数都会触发授权,DriveApp.getFileById(fileId.makeCopy()代码>要从中运行的代码?绑定到工作表的项目?还是网络应用?如果是从web应用运行的,则复制文件会将文件放入web应用所有者的驱动器中,因为web应用正在以“用户部署”的身份执行
它是Web应用程序的所有者。我会将Web应用程序构建为一个独立的应用程序,并将所有支持文件放在一个共享驱动器中,并且不会在Web应用程序中硬连接任何文件ID或导入访问代码。始终从共享驱动器中的支持文件中获取它们。这样,您就可以作为当前用户和任何人进行部署。你想要访问的人需要有一个gmail帐户,并且他们需要访问这个共享帐户。如果无法访问共享帐户,任何人都只能看到没有数据、也无法获取数据的第一页。无法创建共享驱动器?好吧,也许是时候开始使用付费账户了。
function doGet(e) {
var urlScript = e.parameter.urlScript;
var type = e.parameter.type;
var fileId = e.parameter.fileId;
if(type == "stworzKopiePliku"){
DriveApp.getFileById(fileId).makeCopy();
}