Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 如何在google apps脚本的javascript中创建一个带有循环的自定义函数,并将其实现到;C2:C“;射程?_Google Apps Script_Google Sheets_Spreadsheet_Google Sheets Formula_Custom Function - Fatal编程技术网

Google apps script 如何在google apps脚本的javascript中创建一个带有循环的自定义函数,并将其实现到;C2:C“;射程?

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()”时,输出只是给我一些东西,或者得到一些结果,比如结果的单单元格数据,只是值是“0

函数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;
}