标签: google-apps-script

什么是更快:ScriptDb或SpreadsheetApp?

假设我有一个脚本迭代400个对象的列表.每个对象具有1到10个属性.每个属性都是合理大小的字符串或稍大的整数.

将这些对象保存到ScriptDB与将它们保存到Spreadsheet(没有在一次批量操作中执行)的性能存在显着差异.

performance google-sheets google-apps-script

11
推荐指数
2
解决办法
4226
查看次数

Google表单提交

如何引用默认的"提交"表单按钮以将"onsubmit"触发器与另一个操作相关联?谢谢.

例如,使用onsubmit,

Logger.log('do something');
Run Code Online (Sandbox Code Playgroud)

google-apps-script google-forms

11
推荐指数
4
解决办法
3万
查看次数

如何在指定时间后取消UrlFetchApp.fetch?

在循环中使用UrlFetchApp.fetch时,有些URL比其他URL花费的时间更长并且失败.

  • 在获取错误之前有没有办法取消或中断循环?
  • UrlFetchApp.fetch是否有超时参数?

有任何想法吗?

timeout google-apps-script

11
推荐指数
1
解决办法
2975
查看次数

永久删除谷歌驱动器中的文件

如何使用谷歌脚本永久删除谷歌驱动器上的文件我只找到方法setTrashed.它将文件移动到废纸篓,但如何永久删除文件

google-docs-api google-apps-script google-drive-api

11
推荐指数
1
解决办法
1万
查看次数

如何使用Google Script在Google文档中添加超链接

我一直使用insertText()函数,但现在我想在我的google文档中编写一个链接.理想的是能够用HTML编写,但我不知道如何...似乎使用insertText()函数是不可能的.

我怎样才能做到这一点 ?

google-docs hyperlink google-apps-script

11
推荐指数
2
解决办法
2万
查看次数

将 Google Apps Script Web 应用程序限制为仅限特定用户使用

制作一个网络应用程序,对我的 Google Drive 上的某些(表格)文件进行更改(即用户将像我一样使用该应用程序),但我想将网络应用程序访问权限限制为仅某些用户。部署应用程序时,我只能选择将其设为私有或公开。一种解决方案是使用会话类来查看是否有正确的用户登录。

function onAppBegin(){

 if (Session.getActiveUser().getEmail() != "correctappuser@gmail.com") return null;
 accessGranted();
}
Run Code Online (Sandbox Code Playgroud)

但是,我担心这种粗略的方法是否真的安全且不可破解?

google-apps-script

11
推荐指数
1
解决办法
4470
查看次数

Google App脚本桌面IDE

我喜欢将Google表格与应用程序脚本一起使用,但在线脚本ide很麻烦(滞后等),并且没有桌面ide的许多便利。希望Google能够在某个时候开发出台式机。有人知道制作Google应用脚本的痛苦程度较小吗?是否有支持远程更新或发布Google脚本的好方法?

google-sheets google-apps-script

11
推荐指数
2
解决办法
3442
查看次数

Google App Script Deploy as Web App 卡在获取数据

我正在 G Suite 中为我的公司开发一个内部应用。我在电子表格应用程序中使用了一个模态对话框。我找不到在 Drive for mobile 上执行此操作的方法,因此我决定将其部署为 Web 应用程序。我从来没有在应用程序脚本中使用过这个功能,所以我决定在将它应用到我的活动项目之前设置一个新项目来处理。我在项目中有两个文件;代码.gs

    function doGet(e) {
  return HtmlService
    .createHtmlOutputFromFile('mainPage')
    .setSandboxMode(HtmlService.SandboxMode.IFRAME);
}
Run Code Online (Sandbox Code Playgroud)

和 mainPage.html

<!DOCTYPE html>

<head>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
</head>

<body>
    <!-- Reference: http://getbootstrap.com/javascript/#tabs -->
    <div role="tabpanel">
        <!-- Nav tabs -->
        <ul class="nav nav-tabs" role="tablist">
            <li role="presentation" class="active"><a role="tab" data-toggle="tab" aria-controls="home" href="#home">Home</a>
            </li>
            <li role="presentation"><a role="tab" data-toggle="tab" aria-controls="profile" href="#profile">Profile</a>
            </li>
            <li role="presentation"><a role="tab" data-toggle="tab" aria-controls="messages" href="#messages">Messages</a>
            </li>
            <li role="presentation"><a role="tab" data-toggle="tab" aria-controls="settings" href="#settings">Settings</a>
            </li>
        </ul>
        <!-- Tab panes -->
        <div class="tab-content">
            <div role="tabpanel" …
Run Code Online (Sandbox Code Playgroud)

web-applications google-apps-script google-workspace

11
推荐指数
2
解决办法
5976
查看次数

Google Picker API Invalid origin value 错误

今天 Google Picker 在我的 Google Sheets 插件中停止工作,代码没有任何更改。模态对话中的错误内容如下:

无效的原始值。

控制台中的错误是:

无法在“DOMWindow”上执行“postMessage”:提供的目标源(“https://docs.google.com”)与收件人窗口的源(“https://n-a6p4dqsl***d6wq-0lu”)不匹配-script.googleusercontent.com')

丢弃 postMessage .. 来自意外的窗口

丢弃 postMessage .. 来自意外的窗口

加载“https://docs.google.com/picker?protocol=gadgets&origin=https%3A%2F%2Fdocs.google.com%2F&sdr=true&title&oauth_token=<oathToken>&developerKey=”时遇到无效的“X-Frame-Options”标头<developerKey>&hostId=n-a6p4dq***d6wq-0lu-script.googleusercontent.com&relayUrl=https%3A%2F%2Fn-a6p4dq***d6wq-0lu-script.googleusercontent.com%2Ffavicon.ico&nav=((% 22documents%22%2Cnull%2C%7B%22selectFolder%22%3Atrue%2C%22parent%22%3A%22root%22%7D)%2C(%22documents%22%2Cnull%2C%7B%22dr%22%3Atrue% 2C%22includeFolders%22%3Atrue%7D))&rpcService=qhurmoc5w4l7&rpctoken=xssf8g42xc2&thirdParty=true#rpctoken=xssf8g42xc2':'ALLOW-FROM https://docs.google.com/'不是公认的指令 标题将被忽略。

也许错误与我所做的这行代码有关setOrigin():

        var picker = new google.picker.PickerBuilder()
            .addView(driveView)
            .addView(drivesView)
            .hideTitleBar()
            .setOAuthToken(token)
            .setDeveloperKey(DEVELOPER_KEY)
            .setCallback(pickerCallback)
        --> .setOrigin(google.script.host.origin)
            .setSize(DIALOG_DIMENSIONS.width - 2,
                DIALOG_DIMENSIONS.height - 2)
            .build();
Run Code Online (Sandbox Code Playgroud)

但这行代码直接来自 Google Picker API 的文档,并且之前工作正常。如果我更改google.script.host.origin,它会https://docs.google.com作为 url返回到https://n-a6p4dqsl***6wcd6wq-0lu-script.googleusercontent.com,我会收到相同的错误和一个新错误,所以不是这样。

我也无法将其添加为 GCP 项目中的授权 javascript 源,因为它返回以下错误:

无效的来源:使用了禁止的域

(这种情况已经有一段时间了)

这似乎是一个新错误,我无法在 Google 的问题跟踪器和 StackOverflow 上找到答案。

任何人都面临这个问题或知道如何处理它?

javascript google-apps-script google-picker google-cloud-platform

11
推荐指数
1
解决办法
877
查看次数

Apps 脚本活动报告/可视化

我一直在为我的公司开发一个应用程序脚本项目来跟踪我们的时间/费用。我已经像这样构建了项目:

  • 该公司拥有一个付费 Gsuite 帐户,该帐户拥有该公司谷歌驱动器上托管的所有电子表格。
  • 每个员工都有自己的“用户”电子表格,该电子表格从公司 Gsuite 帐户与员工的个人 Gmail 帐户共享。
  • 每个用户电子表格都有一个访问中央库脚本的容器绑定脚本。
  • 库脚本允许我们集中更新脚本,效果对每个用户都是立竿见影的。它还可以防止用户看到中心脚本并对其进行干预。
  • 每个用户容器绑定脚本都有可安装的触发器,这些触发器由公司帐户授权,以便正在运行的代码拥有对电子表格执行所需操作的完全权限。

这个设置对我们有大约 40 个用户来说效果很好。这种设置的缺点是,由于所有脚本活动都由公司帐户通过触发器运行,我们所有用户的活动都记录在单个公司帐户下,因此受到单个用户的应用程序脚本服务器配额的限制。只要我们的脚本运行效率高,这对我们来说还不是什么大问题。我已经考虑将这个项目部署为我们公司的网络应用程序,但似乎没有一个好的方法来控制/限制用户对中央文件的访问。换句话说,如果该项目作为由每个用户安装的 Web 应用程序运行,则每个用户都需要访问该项目在幕后使用的所有中央电子表格。我们不希望那样。

有了这样的背景,这是我的问题。我如何有效地跟踪应用程序脚本活动以查看我们离达到服务器配额有多近,并确定我的哪些功能需要优化?

每次调用脚本时,我都会通过在“活动日志”电子表格中写入一个条目来开始执行此操作。它跟踪调用了什么函数,用户是谁,它有一个开始时间条目和结束时间条目,所以我可以看到唯一的执行需要多长时间以及哪些失败。这很棒,因为我可以实时查看项目活动,并且可以使用电子表格图表工具绘制它。这开始崩溃的地方是脚本的每次执行都需要两个写操作:一个用于初始化,另一个用于完成。由于每次用户对其电子表格进行编辑时都会执行该脚本,因此在高流量期间,活动日志电子表格变得无法访问并且错误会到处抛出。

因此,我通过将每个脚本文件连接到单个 Google Cloud Platform (GCP) 项目并使用 Logger API 来过渡到跟踪活动。写入日志比向电子表格写入条目要高效得多,因此高流量错误几乎消失了。现在的问题是 GCP 日志浏览器不像电子表格那样易于使用,我无法绘制日志或总结活动以查看我们的服务器配额情况。

我现在花了一些时间试图弄清楚如何从 GCP 自动导出日志,以便我可以实时处理日志。我了解如何将日志下载为 csv 文件,然后我可以将其导入谷歌电子表格并进行我需要的计算和绘图,但这是一个手动过程,不显示实时数据。

我还想出了如何通过设置一个“接收器”将日志传输到理论上可以被其他服务读取的“存储桶”来从 GCP 流式传输日志。这让我兴奋地尝试使用 Google Data Studio,我看到它能够使用 Google Cloud Storage“存储桶”作为数据源。不幸的是,谷歌数据工作室只能读取云存储中的 csv 文件,而不能读取我的“接收器”在我的“存储桶”中为日志生成的 json 文件。

所以我撞墙了。我在这里错过了什么吗?我只是想获取显示我们应用程序脚本项目当前活动的实时数据,以便我可以识别失败的执行,查看总处理时间,并按用户或功能对日志进行排序,以便我可以快速确定需要优化脚本的位置。

google-apps-script google-cloud-platform google-data-studio

11
推荐指数
1
解决办法
91
查看次数