首页 > 解决方案 > 循环数组的谷歌脚本在第一次运行后变得未定义

问题描述

经常来这里后第一次在论坛上写...所以请多多包涵。

该代码附在 Google 工作表上 - 使用 google script V10 进行操作。

基本前提是让工作表能够在每个事件中复制,并允许我们为客户创建事件结束报告 - 这个过程有效,但是需要很多繁琐的步骤才能使其工作,因此我目前正在制作这个脚本根据传入的数据将其自动化,然后进一步简化流程,使其不需要数小时,只需几分钟即可完成。

我有一段很长的代码在循环和运行时没有错误——除了一些值在第一次循环后变得未定义。我附上了我的执行日志以供参考。

这是它应该如何运行

  1. 用户将两组原始数据放入第二个和第三个选项卡
  2. 用户运行脚本(从一个菜单项,它工作正常)
  3. 脚本从选项卡 3 中的“上下文”列中获取唯一值
  4. 将第 3 步的值放入数组
  5. 为数组中的每个项目创建一个新选项卡

5-1:粘贴4个信息单元格(1:文本,3:公式)

5-2:根据数组值设置选项卡名称

5-3:仅删除所有公式/代码并粘贴值-(我这样做是因为在导出代码时会中断,所以只希望在输入公式后保留这些值)我没有实现这个

  1. 将数组值填充到第一个选项卡上

它正在执行上述一些步骤,但由于数组“当前值”变得未定义,它没有正确填充单元格和工作表选项卡名称。否则它正在做我想要它做的事情。

它附加到的谷歌表:https ://docs.google.com/spreadsheets/d/1aZBNp6b47-qp-1m-1dX0XtnGG2o1Nrs4AbckGInt0t8/edit?usp=sharing

//Build session reports
function allSessionNames2() {

//All Available variables
var TemplateSheet = SpreadsheetApp.getActiveSpreadsheet().getSheets();
Logger.log("TemplateSheet: " + TemplateSheet);
var TemplateTab = TemplateSheet[3].getName();
Logger.log("TemplateTab: " + TemplateTab);
var OverviewSheet = SpreadsheetApp.getActiveSpreadsheet().getSheets();
var overviewTab = OverviewSheet[0].getName();
var CurrentSheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[2];
var CurrentSpread = SpreadsheetApp.getActiveSpreadsheet();
var CurrentTab
var OnAIRSheet = SpreadsheetApp.getActiveSpreadsheet().getSheets();
var OnAIRTab = OnAIRSheet[2]
var CurrentSessionName = "";
var LastRow = OnAIRTab.getLastRow();
var SessionNamesArray = OnAIRTab.getRange(2, 15, LastRow, 1).getValues();
var SessionNamesArraySize = SessionNamesArray.length;
var TemplateContentsA = "Session Name";
var TemplateContentsB = "Contact Identifier";
var Range1 = "B1";
var Range2 = "A1";
var Range3 = "A3";
var Range4 = "A4";
var Formula1 = "=iferror(FILTER(\'\RAW OnAIR\'\!B:V,REGEXMATCH(\'\RAW OnAIR\'\!O:O,B1)),\"\Session does not exist\"\)";
var Formula2 = '=FILTER(\'\RAW OnAIR\'\!1:1,\'\RAW OnAIR\'\!A1 = \"\Contact Identifier\"\)';



//1. Fill Formula on Overview page
SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange("A4").setFormula("=UNIQUE('RAW OnAIR'!P2:P)");
Logger.log("Fill Formula on Overview tab - cell A4")

//2. Retrieve all sessions into array
Logger.log("SessionNamesArray: " + SessionNamesArray);
Logger.log("SessionNamesArraySize: " + SessionNamesArraySize);

//3. Begin loop for creating a tab per session
for (var i = 0; i < SessionNamesArraySize - 1; i++) {
    if (i == 0) {
  Logger.log("Starting Tab creation loop");
  Logger.log("Variable i: " + i);
} else {
  Logger.log("restarting tab creation loop");
  Logger.log("Variable i: " + i);
}
  var ActiveSessionName = SessionNamesArray[0][i];
  Logger.log("Current Session name: " + SessionNamesArray[0][i]);
  Logger.log("Current Session name: " + ActiveSessionName);
  //Create new sheet + paste code
  CurrentSpread.insertSheet(ActiveSessionName);
  //Paste code
  Logger.log("Setting active range B1 - set value...");
  CurrentSpread.setActiveSelection(Range1).setValue(ActiveSessionName);
  CurrentSpread.setActiveSelection(Range2).setValue("Session Name:");
  CurrentSpread.setActiveSelection(Range4).setFormula(Formula1);
  CurrentSpread.setActiveSelection(Range3).setFormula(Formula2);
  Logger.log("Setting values in cells.... Done.")
  
}

//4. Confirm tab count equals total session count minus the first 3 tabs
    return Logger.log("Loop completed for sessions: " + ActiveSessionName);
}
9:27:42 AM  Notice  Execution started
9:27:42 AM  Info    TemplateSheet: Sheet,Sheet,Sheet,Sheet
9:27:42 AM  Info    TemplateTab: Template
9:27:43 AM  Info    Fill Formula on Overview tab - cell A4
9:27:43 AM  Info    SessionNamesArray: Alphabet stuff,b,C,d,E,
9:27:43 AM  Info    SessionNamesArraySize: 6
9:27:43 AM  Info    Starting Tab creation loop
9:27:43 AM  Info    Variable i: 0
9:27:43 AM  Info    Current Session name: Alphabet stuff
9:27:43 AM  Info    Current Session name: Alphabet stuff
9:27:43 AM  Info    Setting active range B1 - set value...
9:27:43 AM  Info    Setting values in cells.... Done.
9:27:43 AM  Info    restarting tab creation loop
9:27:43 AM  Info    Variable i: 1
9:27:43 AM  Info    Current Session name: undefined
9:27:43 AM  Info    Current Session name: undefined
9:27:43 AM  Info    Setting active range B1 - set value...
9:27:43 AM  Info    Setting values in cells.... Done.
9:27:43 AM  Info    restarting tab creation loop
9:27:43 AM  Info    Variable i: 2
9:27:43 AM  Info    Current Session name: undefined
9:27:43 AM  Info    Current Session name: undefined
9:27:44 AM  Info    Setting active range B1 - set value...
9:27:44 AM  Info    Setting values in cells.... Done.
9:27:44 AM  Info    restarting tab creation loop
9:27:44 AM  Info    Variable i: 3
9:27:44 AM  Info    Current Session name: undefined
9:27:44 AM  Info    Current Session name: undefined
9:27:44 AM  Info    Setting active range B1 - set value...
9:27:45 AM  Info    Setting values in cells.... Done.
9:27:45 AM  Info    restarting tab creation loop
9:27:45 AM  Info    Variable i: 4
9:27:45 AM  Info    Current Session name: undefined
9:27:45 AM  Info    Current Session name: undefined
9:27:45 AM  Info    Setting active range B1 - set value...
9:27:45 AM  Info    Setting values in cells.... Done.
9:27:45 AM  Info    Loop completed for sessions: undefined
9:27:47 AM  Notice  Execution completed

标签: javascriptarrayslogginggoogle-sheets

解决方案


解释

您似乎正在尝试将 sessionNamesArray 作为多列数据而不是多行来访问。getValues() 获取的二维数组的结构是 variable[row][column]。查看您的代码,您已使用多行但仅 1 列设置 sessionNamesArray 的范围,但在循环内,您在 2d 数组的列部分中分配了 i 。

解决方案

您可以尝试将代码的那部分更改为:

  var ActiveSessionName = SessionNamesArray[i][0];
  Logger.log("Current Session name: " + SessionNamesArray[i][0]);

推荐阅读