标签: google-apps-script

如何从 Google Sheets 获取数据并将其显示在 Google Forms 上?

我正在制作一个Google 表单,我想向其中添加一些问题,但这些问题应该从Google Sheet中的问题池中随机挑选。为此需要做什么?例如:我想从 Google 表格的 20 个问题池中随机显示 5 个问题

Ps:我确实尝试了 Stackoverflow 上已经提到的解决方案,但它对我的目的没有帮助。

google-sheets google-apps-script google-forms

0
推荐指数
1
解决办法
1016
查看次数

如何使用全局变量同时避免权限错误?

请参阅下面的示例,

function doSomething1(){/*needs ss*/const ss = SpreadsheetApp.openById(/*SPREADSHEET_ID*/);}
function doSomething2(){/*needs ss*/const ss = SpreadsheetApp.openById(/*SPREADSHEET_ID*/);}
function doItAll(){
  doSomething1();
  doSomething2();
}
Run Code Online (Sandbox Code Playgroud)

可以使用全局变量来简化,而不是在两个函数中调用 Spreadsheet

const ss = SpreadsheetApp.openById(/*SPREADSHEET_ID*/);
function doSomething1(){/*do something with ss*/}
function doSomething2(){/*do something with ss*/}
function doItAll(){
  doSomething1();
  doSomething2();
}
Run Code Online (Sandbox Code Playgroud)

这里的问题可以在不使用全局变量的情况下通过简单地ss在函数之间传递变量来解决。但是,由于多个函数需要访问该变量,这会变得更加复杂ss。而且通过ss很麻烦。没有太多方法可以避免应用程序脚本中的全局。不支持模块。如果您使用 IIFE,则所有函数都对 IDE 隐藏,从而无法从 IDE 或其他任何地方调用函数。在这里使用全局要优雅得多。但如果我有一个简单的触发器,就会出现问题:

const ss = SpreadsheetApp.openById(/*SPREADSHEET_ID*/);
function doSomething1(){/*do something with ss*/}
function doSomething2(){/*do something with ss*/}
function doItAll(){
  doSomething1();
  doSomething2();
}
function onOpen(){/*Adds a menu*/}
Run Code Online (Sandbox Code Playgroud)

添加菜单将失败,因为此行之前onOpen已加载,并且此行需要权限/授权,而作为简单触发器,不会使用任何需要授权的代码运行。SpreadsheetApp.openById(/*SPREADSHEET_ID*/)onOpenonOpen …

lazy-loading global-variables google-sheets google-apps-script

0
推荐指数
1
解决办法
1281
查看次数

Google Apps 脚本 - 根据单元格中的值发送电子邮件

我是 Google 应用脚本新手,有一个包含三列的电子表格:名称、过期和上次联系:https ://docs.google.com/spreadsheets/d/1W04JiFZwpGCD-qddUkNJ9xQ1xiYwZnGhissudF1EvxM/edit?usp=sharing

我想向自己发送一封电子邮件提醒,其中包含 B 列中逾期金额的任何人的姓名。

到目前为止,我只能编写一个脚本,为第 2 行向自己发送电子邮件。我不知道如何让脚本循环遍历 B 列中的值。

这是我的脚本:

function sendEmail() {
  
  var overdueRange = SpreadsheetApp.getActiveSpreadsheet().getRange("B2"); 
  var overdueValue = overdueRange.getValue();
  if (overdueValue === "Overdue"){
    var nameRange = SpreadsheetApp.getActiveSpreadsheet().getRange("A2");
    var name = nameRange.getValues();
    var message = 'Reach out to ' + name 
    var subject = 'Reach out to this person.'
    MailApp.sendEmail('myemail@email.com', subject, message);
    }
}

sendEmail()
Run Code Online (Sandbox Code Playgroud)

javascript google-apps google-sheets google-apps-script

0
推荐指数
1
解决办法
6550
查看次数

如何在不同文件中使用 GAS 类,而与文件加载顺序无关?

考虑以下简单示例,文件country.gs

class Country { }
Run Code Online (Sandbox Code Playgroud)

和文件subcountry.gs

class SubCountry extends Country{ }

function test(){}
Run Code Online (Sandbox Code Playgroud)

尝试运行 test() 我得到

ReferenceError: Country is not defined
Run Code Online (Sandbox Code Playgroud)

如果我加入文件或更改加载顺序,它就可以正常工作。

显然,我不想依赖于文件加载顺序,也不想在推送时进行更改(按字母顺序排序),所以这绝对不是重命名文件以便编译它们的好方法。

对此有合适的解决方案吗?

例子:

https://script.google.com/d/1Pipt3YN1FBGkbRRT2PyCHhugd-Xrv3zctIWYwX-cGnAjXfDckwOk7bJh/edit?usp=sharing

global-variables google-apps-script

0
推荐指数
1
解决办法
571
查看次数

如何在appscript中获取数组的最大索引

我试图将一行中的值放入数组中。为此,我使用了 googlesheet 中的 appscript。检查这个数组的长度后rowtemp,答案是1。但我想找到里面的孩子的数量。如果“temp”中的元素与“rowtemp”中的元素相同,那么您需要找到我使用以下代码的列号。 在此输入图像描述

    function rangeExa(){
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet4");

  var temp = ss.getRange("A11:B22").getValues();
  Logger.log(temp);
  Logger.log(temp.length);
  Logger.log(temp[3][0]);

  var rowTemp = ss.getRange("D25:O25").getValues();
  Logger.log(rowTemp);
  Logger.log(rowTemp.length);
  Logger.log(rowTemp[0][2]);
  Logger.log(rowTemp);

  for(i=0; i<=rowTemp.length; i++){
  if(temp[3][0] == rowTemp[0][i]){
    Logger.log("yessss");
  }return;
  }  
}
Run Code Online (Sandbox Code Playgroud)

google-sheets google-apps-script

0
推荐指数
1
解决办法
357
查看次数

0
推荐指数
1
解决办法
430
查看次数

谷歌表格脚本| 全局变量在 html 侧边栏/模态窗口后失去其值

大家好,我有一个团队假期日历。用户按字母“v”来设置假期日期,假期日期存储在外部工作表中(用于其他目的,因此我不能简单地在同一电子表格中拥有单独的工作表)。

问题是,假期日期可以是“付费”或“银行”(以便稍后记入)。我使用模态 Html 窗口询问用户假期是两者中的哪一个。但是,我在打开 html 模式窗口之前设置的全局变量失去了它们的值。我需要这些全局变量来存储原始条目的行和列(因为用户在键入“v”后单击单元格会更改 getActiveCell() 的值。

应该发生什么:

  1. 用户输入“v”
  2. 弹出 html 窗口“这是什么假期类型?银行假期还是付费假期?
  3. 代码将假期日期输入外部电子表格。
  4. 代码将“已付款”或“已银行”值输入到外部电子表格中。

我可以让它进行到上面的步骤 3,但是,全局变量正在丢失其值,并且无法确定用户最初单击的单元格。

步骤1

步骤1

第2步

第2步

var selectedDateRangeRow;
var selectedDateRangeColumn;

function onEdit(e) {
  if (sheet.getRange("AH2").getValue() == true && sheet.getActiveCell().getValue() == "V") {
    selectedDateRangeRow = sheet.getActiveCell().getRow();
    selectedDateRangeColumn = sheet.getActiveCell().getColumn();
    ShowVacationMenu();
  }
}

function ShowVacationMenu() {
  var html = HtmlService.createHtmlOutputFromFile('VacationType').setTitle("New Vacation Date");
  SpreadsheetApp.getUi().showModalDialog(html, "Select Vacation Type");
}

function AddDateToOverTimeSheet(selectedVacationType) {
  Browser.msgBox(selectedDateRangeRow);     //This global value returns empty/null.
}
Run Code Online (Sandbox Code Playgroud)

html 文件:

<!--Let browser know website is optimized for mobile-->
<meta name="viewport" …
Run Code Online (Sandbox Code Playgroud)

javascript google-apps-script

0
推荐指数
1
解决办法
439
查看次数

Apps 脚本 - For 循环很慢。如何让它更快?

我的电子表格有一列 (A),其中包含 1000 多行值,例如 10.99\xe2\x82\xac、25.99 \xe2\x82\xac 等。出于优化目的,我循环浏览此列并删除“EUR”标记并替换“.”。和 ”,”。虽然代码有效,但我的问题是执行时间非常长,并且对于数千种产品有时会超时。我知道我可能没有遵循最佳实践,但由于我有限的 JavaScript 技能,这是我能想到的最佳解决方案。有什么帮助吗?

\n

\r\n
\r\n
function myFunction() {\n  var ss = SpreadsheetApp.getActive();\n  var sheet = ss.getSheetByName(\'Table\');\n  var lastRow = sheet.getRange(1,1).getDataRegion(SpreadsheetApp.Dimension.ROWS).getLastRow();\n  for (var i = 1; i < lastRow +1; i++) {\n    var price = sheet.getRange(i,1).getValue();\n    var removeCur = price.toString().replace(" EUR","").replace(".",",");\n    sheet.getRange(i,1).setValue(removeCur);\n  }\n}
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

javascript for-loop google-sheets google-apps-script

0
推荐指数
1
解决办法
1971
查看次数

如何重置 Google 云端硬盘(文件夹、子文件夹和文件)的权限?

我想将所有文件和文件夹权限重置为“受限”。在整个驱动器上。

谷歌驱动器上的权限不会级联,因此从父文件夹中删除它们不会在子文件夹和文件中删除它们。我有大量的文件和文件夹。

我发现带有脚本的过时帖子,但“Uiapp”功能已被弃用(评论中有人说它可以删除一些文件,所以不是我真正想要的)

这是类似内容的过时帖子(不再工作): https: //webapps.stackexchange.com/questions/37592/how-do-i-reset-permissions-for-google-drive-documents-in-all-子文件夹

google-apps-script google-drive-api

0
推荐指数
1
解决办法
1715
查看次数

Apps 脚本自定义函数在脚本编辑器中工作,但在 Google Sheet 自定义函数中不起作用

我使用 URLFetchApp 在 Apps 脚本中构建了一个简单的自定义函数来获取 TikTok 帐户的关注者计数。

function tiktok_fans() {
  var raw_data = new RegExp(/("followerCount":)([0-9]+)/g);
  var handle = '@charlidamelio';
  var web_content = UrlFetchApp.fetch('https://www.tiktok.com/'+ handle + '?lang=en').getContentText();
  var match_text = raw_data.exec(web_content);
  var result = (match_text[2]);
  Logger.log(result)
  return result
}
Run Code Online (Sandbox Code Playgroud)

日志会返回正确的关注者数量。

但是,当我将代码更改为;

function tiktok_fans(handle) {
  var raw_data = new RegExp(/("followerCount":)([0-9]+)/g);
  //var handle = '@charlidamelio';
  var web_content = UrlFetchApp.fetch('https://www.tiktok.com/'+ handle + '?lang=en').getContentText();
  var match_text = raw_data.exec(web_content);
  var result = (match_text[2]);
  Logger.log(result)
  return result
}
Run Code Online (Sandbox Code Playgroud)

并在电子表格中使用它,例如=tiktok_fans(A1),其中 A1@charlidamelio#ERROR在单元格中得到响应

类型错误:无法读取 …

google-sheets http-headers google-apps-script custom-function tiktok

0
推荐指数
1
解决办法
409
查看次数