Google apps script 如何在google apps脚本的javascript中创建一个带有循环的自定义函数,并将其实现到;C2:C“;射程?
我使用谷歌应用程序脚本创建了一个函数,当我将其作为自定义函数调用到电子表格单元格中时,但看起来似乎不会循环其中一个或任何东西。也就是说,当我调用这样的自定义函数“=setSheetIdhere()”时,输出只是给我一些东西,或者得到一些结果,比如结果的单单元格数据,只是值是“0”Google apps script 如何在google apps脚本的javascript中创建一个带有循环的自定义函数,并将其实现到;C2:C“;射程?,google-apps-script,google-sheets,spreadsheet,google-sheets-formula,custom-function,Google Apps Script,Google Sheets,Spreadsheet,Google Sheets Formula,Custom Function,我使用谷歌应用程序脚本创建了一个函数,当我将其作为自定义函数调用到电子表格单元格中时,但看起来似乎不会循环其中一个或任何东西。也就是说,当我调用这样的自定义函数“=setSheetIdhere()”时,输出只是给我一些东西,或者得到一些结果,比如结果的单单元格数据,只是值是“0” 函数setSheetIdhere(){ 对于(变量i=0;i
函数setSheetIdhere(){
对于(变量i=0;i
这里我附上了一张图片来描述我的解释。问题是如何生成、收集或设置所有工作表的所有ID
我刚刚在新创建的电子表格上运行了以下内容:
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(),您会发现它总是返回零
function setSheetsId() {
var ss=SpreadsheetApp.getActive();
var shts=ss.getSheets();
for (var i=0; i <shts.length ; i++) {
return shts[i].getSheetId();
}
}
但这不是细胞的功能
我对此进行了一些研究,发现可以使用可安装的onChange()触发器运行它,每次添加其他工作表时,它都会更新列表
代码如下:
//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;
}
//这被修改为与事件对象一起运行,而不是与控制列开始位置的参数一起运行
函数GenerateSheetIsToaColumn(e){
Logger.log(JSON.stringify(e));
如果(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(函数{sA.push([s.getSheetId()]);});
sh.getRange(startrow,startcolumn,sA.length,sA[0].length).setValues(sA);
}
}
//这将安装onChange事件触发器
函数installonChange(){
var ss=SpreadsheetApp.getActive();
如果(!isTrigger('generateSheetIdsIntoAColumn')){
ScriptApp.newTrigger('generateSheetIdsIntoAColumn')。用于预览表(ss).onChange().create();
}
}
//此函数帮助您避免创建多个触发器
函数isTrigger(funcName){
var r=假;
如果(名称){
var allTriggers=ScriptApp.getProjectTriggers();
对于(var i=0;i什么是sss
?它没有在函数中定义。它必须是一个工作表数组,但它在哪里定义?您是否意识到由于返回,您的循环只运行一次?您的注释仅显示值零
,因为在新的电子表格中,第一个工作表的sheetId始终为零。以及因为循环总是在第一次迭代中停止,所以总是得到零。我想你需要重新考虑一下。自定义函数被视为确定性函数-它们被明确假定总是为相同的输入返回相同的值。如果你编写的自定义函数不是确定性函数,那就是你的错误。@Cooper我想你是这样的这是最好的一次……你做到了!库珀。我希望你能做到。非常感谢库珀。剩下的事情让我根据我的情况来处理,但最重要的是这真的是最接近的一次,我想我真的应该这么说,谢谢你……#对不起,我的英语很差;p
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);
}
//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;
}