如何在 google 应用程序脚本的 javascript 内创建一个带有循环的自定义函数,并将其实施到范围 "C2:C" 的电子表格中?
How to create a Custom Function with an loops inside of javascript on google apps script and implent it to spreadsheet of "C2:C" of range?
我使用 google 应用程序脚本创建一个函数,当我将其作为自定义函数调用到电子表格单元格中时,但似乎不会循环其中之一或任何东西。这是当我像这样调用自定义函数“=setSheetIdhere()”时,输出只是给我一些东西或者产生一些结果,比如结果的单个单元格数据值为“0”。
function setSheetIdhere() {
for (var i=0; i < sss.length; i++) {
return [[sss[i].getSheetId()]];
}
}
这里我附上一张图片来描述更多我的解释。 问题是如何生成或收集或设置所有表格 ???
我只是 运行 这是一个新创建的传播sheet:
function spreadsheetIds() {
var ss=SpreadsheetApp.getActive();
var shts=ss.getSheets().map(function(sh){return sh.getSheetId();});
Logger.log(shts);
//output - [0, 1550400053, 206842422, 247142844, 124067339]
}
function testsetSheetsId() {
Logger.log(setSheetsId());
//always returns zero
}
我认为这基本上就是您的功能。如果你 运行 testsetSheetsId() 你会发现它总是 returns 零。
function setSheetsId() {
var ss=SpreadsheetApp.getActive();
var shts=ss.getSheets();
for (var i=0; i <shts.length ; i++) {
return shts[i].getSheetId();
}
}
我认为您只需要 运行 这样的函数一次就可以了。
function generateSheetIdsIntoAColumn(startrow,startcolumn) {
var startcolumn=startcolumn||3;
var startrow=startrow||2;
var ss=SpreadsheetApp.getActive();
var sh=ss.getActiveSheet();
var shts=ss.getSheets();
var sA=[];
shts.forEach(function(s){sA.push([s.getSheetId()]);});
var rg=sh.getRange(startrow,startcolumn,sA.length,sA[0].length).setValues(sA);
}
但这不是单元格函数。
我试了一下,我发现你可以 运行 它有一个可安装的 onChange() 触发器,它会在你每次添加另一个 sheet 时更新列表。
这是代码:
//This is modified to run with the event object instead of parameters for controlling where the column starts
function generateSheetIdsIntoAColumn(e) {
Logger.log(JSON.stringify(e));
if(e.changeType=='INSERT_GRID') {
var startcolumn=3;
var startrow=2;
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName("Sheet1");
var shts=ss.getSheets();
var sA=[];
shts.forEach(function(s){sA.push([s.getSheetId()]);});
sh.getRange(startrow,startcolumn,sA.length,sA[0].length).setValues(sA);
}
}
//This installs the onChange event trigger
function installonChange() {
var ss=SpreadsheetApp.getActive();
if(!isTrigger('generateSheetIdsIntoAColumn')) {
ScriptApp.newTrigger('generateSheetIdsIntoAColumn').forSpreadsheet(ss).onChange().create();
}
}
//this functions helps you to keep from creating more than one trigger
function isTrigger(funcName){
var r=false;
if(funcName){
var allTriggers=ScriptApp.getProjectTriggers();
for(var i=0;i<allTriggers.length;i++){
if(funcName==allTriggers[i].getHandlerFunction()){
r=true;
break;
}
}
}
return r;
}
不幸的是,当脚本插入 sheet 时,不会触发 onChange()。它仅在用户添加 sheet 时有效。抱歉,我想我无法帮助您在不使用基于时间的触发器进行轮询的情况下自动完成它。
我使用 google 应用程序脚本创建一个函数,当我将其作为自定义函数调用到电子表格单元格中时,但似乎不会循环其中之一或任何东西。这是当我像这样调用自定义函数“=setSheetIdhere()”时,输出只是给我一些东西或者产生一些结果,比如结果的单个单元格数据值为“0”。
function setSheetIdhere() {
for (var i=0; i < sss.length; i++) {
return [[sss[i].getSheetId()]];
}
}
这里我附上一张图片来描述更多我的解释。 问题是如何生成或收集或设置所有表格 ???
我只是 运行 这是一个新创建的传播sheet:
function spreadsheetIds() {
var ss=SpreadsheetApp.getActive();
var shts=ss.getSheets().map(function(sh){return sh.getSheetId();});
Logger.log(shts);
//output - [0, 1550400053, 206842422, 247142844, 124067339]
}
function testsetSheetsId() {
Logger.log(setSheetsId());
//always returns zero
}
我认为这基本上就是您的功能。如果你 运行 testsetSheetsId() 你会发现它总是 returns 零。
function setSheetsId() {
var ss=SpreadsheetApp.getActive();
var shts=ss.getSheets();
for (var i=0; i <shts.length ; i++) {
return shts[i].getSheetId();
}
}
我认为您只需要 运行 这样的函数一次就可以了。
function generateSheetIdsIntoAColumn(startrow,startcolumn) {
var startcolumn=startcolumn||3;
var startrow=startrow||2;
var ss=SpreadsheetApp.getActive();
var sh=ss.getActiveSheet();
var shts=ss.getSheets();
var sA=[];
shts.forEach(function(s){sA.push([s.getSheetId()]);});
var rg=sh.getRange(startrow,startcolumn,sA.length,sA[0].length).setValues(sA);
}
但这不是单元格函数。
我试了一下,我发现你可以 运行 它有一个可安装的 onChange() 触发器,它会在你每次添加另一个 sheet 时更新列表。
这是代码:
//This is modified to run with the event object instead of parameters for controlling where the column starts
function generateSheetIdsIntoAColumn(e) {
Logger.log(JSON.stringify(e));
if(e.changeType=='INSERT_GRID') {
var startcolumn=3;
var startrow=2;
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName("Sheet1");
var shts=ss.getSheets();
var sA=[];
shts.forEach(function(s){sA.push([s.getSheetId()]);});
sh.getRange(startrow,startcolumn,sA.length,sA[0].length).setValues(sA);
}
}
//This installs the onChange event trigger
function installonChange() {
var ss=SpreadsheetApp.getActive();
if(!isTrigger('generateSheetIdsIntoAColumn')) {
ScriptApp.newTrigger('generateSheetIdsIntoAColumn').forSpreadsheet(ss).onChange().create();
}
}
//this functions helps you to keep from creating more than one trigger
function isTrigger(funcName){
var r=false;
if(funcName){
var allTriggers=ScriptApp.getProjectTriggers();
for(var i=0;i<allTriggers.length;i++){
if(funcName==allTriggers[i].getHandlerFunction()){
r=true;
break;
}
}
}
return r;
}
不幸的是,当脚本插入 sheet 时,不会触发 onChange()。它仅在用户添加 sheet 时有效。抱歉,我想我无法帮助您在不使用基于时间的触发器进行轮询的情况下自动完成它。