javascript - 循环数组的谷歌脚本在第一次运行后变得未定义
问题描述
经常来这里后第一次在论坛上写...所以请多多包涵。
该代码附在 Google 工作表上 - 使用 google script V10 进行操作。
基本前提是让工作表能够在每个事件中复制,并允许我们为客户创建事件结束报告 - 这个过程有效,但是需要很多繁琐的步骤才能使其工作,因此我目前正在制作这个脚本根据传入的数据将其自动化,然后进一步简化流程,使其不需要数小时,只需几分钟即可完成。
我有一段很长的代码在循环和运行时没有错误——除了一些值在第一次循环后变得未定义。我附上了我的执行日志以供参考。
这是它应该如何运行
- 用户将两组原始数据放入第二个和第三个选项卡
- 用户运行脚本(从一个菜单项,它工作正常)
- 脚本从选项卡 3 中的“上下文”列中获取唯一值
- 将第 3 步的值放入数组
- 为数组中的每个项目创建一个新选项卡
5-1:粘贴4个信息单元格(1:文本,3:公式)
5-2:根据数组值设置选项卡名称
5-3:仅删除所有公式/代码并粘贴值-(我这样做是因为在导出代码时会中断,所以只希望在输入公式后保留这些值)我没有实现这个
- 将数组值填充到第一个选项卡上
它正在执行上述一些步骤,但由于数组“当前值”变得未定义,它没有正确填充单元格和工作表选项卡名称。否则它正在做我想要它做的事情。
//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
解决方案
解释
您似乎正在尝试将 sessionNamesArray 作为多列数据而不是多行来访问。getValues() 获取的二维数组的结构是 variable[row][column]。查看您的代码,您已使用多行但仅 1 列设置 sessionNamesArray 的范围,但在循环内,您在 2d 数组的列部分中分配了 i 。
解决方案
您可以尝试将代码的那部分更改为:
var ActiveSessionName = SessionNamesArray[i][0];
Logger.log("Current Session name: " + SessionNamesArray[i][0]);
推荐阅读
- react-native-android - 如何在 react-native 中播放和暂停视频?
- pandas - python中具有条件的列的总和
- php - 使用 php 从 url 获取传递的变量
- hangouts-chat - 如何在google hangout chat中删除Webhook发送的消息
- security - 绕过 Origin 标头检查和 CSRF 攻击
- excel - 当 SAP 弹出消息告诉我们没有找到数据时,如何继续运行 VBA 宏?
- python - python中的字符串比较失败
- python - 展开列条目并从 pandas 中的一行或多行添加值
- amazon-web-services - 将数据从一个 aws 队列 (SQS) 复制到另一个 SQS 的最佳方法
- jenkins - 跳过“PylintSensor”,因为质量配置文件中没有激活相关规则