我有一个 Google Apps 脚本自定义函数,非常简单:
function sharesBurned(sharesToSell) {
return "tree"
}
Run Code Online (Sandbox Code Playgroud)
显然,当我在 Apps 脚本中测试它时,这是有效的。例如,在我的工作表中,当我在单元格中调用它时sharesBurned(2),它有时会返回“正在加载”,并且在单元格的右上角会出现一个红色三角形符号,当将鼠标悬停在该符号上时,会显示:“错误 -加载数据中...”。
我知道有几个关于此的线程,但它们已经很旧了,而且我已经尝试了所有建议,但都无济于事,即:
需要明确的是,该函数有一半的时间无缝地加载到单元格中,而另一半则像这样卡住了。我非常怀疑这是脚本本身的问题,所以这可能是 Google Sheets 的一些奇怪的错误(缓存?没有线索)。
当我调用电子表格函数时int(f2),该函数对单元格中的值进行操作.如果cell("F2")包含3.14159,则结果为3.但是当我调用不同类型的函数时 - 例如:row(f8)- 函数采用单元格引用,而不是值,在这种情况下,返回8.
如何让我的自定义函数使用引用而不是值?
我可以传递一个字符串,并使用getRange(),但是,如果我移动或更新工作表上的单元格,字符串将不会更改.
非常简单的例子:
function GetFormula(cellname) {
return SpreadsheetApp.getActiveSheet().getRange(cellname).getFormula();
}
Run Code Online (Sandbox Code Playgroud)
在我的工作表代码中,我可以像这样检索C4中的公式: =GetFormula("C4")
但是,这个参数是一个字符串,我宁愿传递一个单元格引用.一个更复杂的问题需要在复制和粘贴时更新呼叫单元.
有任何想法吗?
在谷歌表中,我希望我的自定义功能使用其中一个内置函数.具体来说,此函数将字符串作为参数,梳理另一个工作表以找到该值,然后返回指向该单元格地址的链接.
function href(findMe) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var hrefSheet = ss.getSheetByName("otherSheet");
hrefSheet.activate();
var rows = hrefSheet.getDataRange();
var numRows = rows.getNumRows();
var finds = rows.getValues()[1][0];
var hrefCellRow;
for(var i=0; i<numRows; i++){
if(finds[i][0] == findMe){
hrefCellRow = i+1;
break;
}
}
return address(hrefCellRow, 1); //address() is a function that is built in to sheets
}
Run Code Online (Sandbox Code Playgroud)
因此,如果我在"otherSheet"表单中有一个值"XYZ",那么当我输入时
=href("XYZ")
Run Code Online (Sandbox Code Playgroud)
我希望它尝试找到值XYZ并将地址返回到活动单元格.额外的荣誉如果它返回一个实际的链接,当点击,进入该单元格.
问题:当我运行脚本时,Google告诉我," 您无权调用openById. "
我从另一个Google电子表格中复制了一个脚本,并更改了target_ssKey变量的单元格引用,并在源电子表格和目标电子表格中创建了适当大小的命名范围.
GAS文档没有说明它可能无法工作的原因:
https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app#openById%28String%29
另一个GAS文档说它应该对我有用,因为我从自定义菜单中调用它:
https://developers.google.com/apps-script/guides/sheets/functions#using_apps_script_services
上面的第二个链接说:
如果您的自定义函数抛出错误消息您没有权限调用X服务.,该服务需要用户授权,因此不能用于自定义功能.
要使用上面列出的服务以外的服务,请创建一个运行Apps脚本功能的自定义菜单,而不是编写自定义功能.从菜单触发的功能将在必要时要求用户进行授权,因此可以使用所有Apps脚本服务.
我尝试将该函数放入"自定义函数"项目,然后放入"附加"项目,但仍然得到相同的错误消息.
关于我做错了什么以及如何使这项工作的任何想法?
这是我的确切代码:
function exportData_SStoSS() {
// Get the source data.
var source_ss = SpreadsheetApp.getActiveSpreadsheet();
var data = source_ss.getRangeByName("exportData").getValues();
// Identify the target.
var controls_sh = source_ss.getSheetByName("Controls");
var target_ssKey = controls_sh.getRange('C2').getValue();
var target_ss = SpreadsheetApp.openById(target_ssKey);
// Paste the data to the target.
target_ss.getRangeByName("importData").setValues(data);
};
Run Code Online (Sandbox Code Playgroud) 在电子表格中,我可以输入=SIN(45)+123一个单元格,然后进行评估.
如何评估自定义函数中的电子表格函数,例如"eval"函数,它可以像这样工作:
function myFunc() {
return Sheet.eval("=SIN(45)+123")
}
Run Code Online (Sandbox Code Playgroud)
可能吗 ?
请注意,我不关心SIN在特定的功能,我要的是能够访问的电子表格功能完整的阿森纳(PMT,QUERY,NPER,等.)
我有一些我一直使用的简单自定义函数.我最近遇到了一个我迫切需要使用它们的电子表格,但是当我尝试使用最基本的自定义函数时,我得到了"#NAME".悬停文字"未知功能".
即使删除所有其他代码,并尝试这个简单的功能,似乎不起作用:
function double(d) {
return 2*d;
}
Run Code Online (Sandbox Code Playgroud)
当我重复的电子表格,随之而来的代码DOES工作.
一些注意事项:
这是Google Apps for Enterprise帐户.
我原本不是这个电子表格的所有者,但后来成为了所有者,认为这可能是原因.
该电子表格最初具有受保护的区域,这些区域已被删除,认为这可能是原因.
这个电子表格与数百人共享,所以我真的想找到根本原因并修复它.
有什么想法吗?
我在工作表中在工作表中创建了一个新函数。无法识别该函数:
function DOUBLE(input) {
return input * 2;
}
Run Code Online (Sandbox Code Playgroud)节省
进入工作表,输入一个单元格并键入 =double(10)
错误“未知函数‘double’”
在Google电子表格中应用条件格式时,我想知道是否可以使用我在"自定义公式"字段中通过脚本编辑器创建的自定义函数.这是我做的:
去'脚本编辑器'并键入我的fn如下:
function foo (param1, param2, param3) {
if (condition to check) {
...some action;
return true;
} else {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
并保存.
在工作表中,选定单元格并打开"条件格式"对话框
创建新规则并在字段中'自定义公式是:'键入以下内容
=foo(param1, param2, param3)
Run Code Online (Sandbox Code Playgroud)不幸的是,这不起作用.
加成
这是样本表 ......
看那里的两个任务.我的目标是将"任务标题"自动写入黄色字段内(请参阅第6行中我手动输入值的任务).
我已经尝试的是: - 分配给H5:BB7公式中的每个单元格:=if(H$4=D5; B5; "")
这将检查开始日期是否等于单元格日期并显示任务标题.这样就可以解决问题,但是即使"溢出"打开,具有任务标题的单元格的内容也会被剪切,因为下一个单元格不为空.
google-sheets google-apps-script gs-conditional-formatting custom-function
Google 暗示支持 JsDoc:
如果自定义函数的脚本包含 JsDoc @customfunction 标记,则自定义函数将出现在此列表中,如下面的 DOUBLE() 示例所示。
https://developers.google.com/apps-script/guides/sheets/functions
但似乎并没有完全支持 JsDoc,而且我找不到显示支持和不支持的文档。
我特别寻找一种方法来记录自定义函数的参数是可选的。像这样,对于 value2:
使用 JsDoc,您应该能够根据此源执行以下操作: https ://jsdoc.app/tags-param.html#optical-parameters-and-default-values
/**
* @param {number} [value2] - Additional numbers or ranges to add to value1.
*/
Run Code Online (Sandbox Code Playgroud)
并且,使用默认值:
/**
* @param {number} [value2=100] - Additional numbers or ranges to add to value1.
*/
Run Code Online (Sandbox Code Playgroud)
但我在谷歌表格中对此进行了测试,但这些都不起作用。甚至没有建议的 Google Closure Compiler 语法(如果可以的话):
/**
* @param {number=} value2 - Additional numbers or ranges to add to value1.
*/
Run Code Online (Sandbox Code Playgroud)
目前我已经采取了不太优雅的方法:
/**
* @param {number} value2 - …Run Code Online (Sandbox Code Playgroud) 我已经基于此线程使用 dplyr::mutate() 创建了一个动态列名称在 `dplyr` 中使用动态变量名称,现在我想对新列进行排序....但我没有正确传递该列姓名
library(glue)
library(dplyr)
# data
set.seed(123)
df <- data.frame(distance = sample(1:100, size = 10))
# custom function
multiply_function <- function(df, metric, multiplier){
df %>%
mutate(., "{{metric}}_x{{multiplier}}" := {{metric}} * multiplier) %>%
arrange(desc("{{metric}}_x{{multiplier}}")) # <--- this is not working
}
df %>%
multiply_function(., metric = distance, multiplier = 3)
distance distance_x3
1 31 93
2 79 237
3 51 153
4 14 42
5 67 201
6 42 126
7 50 150
8 43 129 …Run Code Online (Sandbox Code Playgroud)