ArrayLib 未定义
ArrayLib is not defined
我是剧本写作的初学者。基本上我已经为我编写了几个脚本,多年来我一直能够管理这些脚本。然而,我使用 运行 多年的脚本突然停止工作。我所知道的一切都没有改变。 (老实说,我不知道我在看什么,甚至无法识别是否有东西)请如果有人可以提供帮助,我们将不胜感激。 ReferenceError:未定义 ArrayLib(第 50 行,文件“代码”)
拜托拜托
function OOU() {
var ss = SpreadsheetApp.openById("1L9f8wx3OYnry_UocEpBapuEmismMd6XYBO1Kl9e4duE");
var unitsoou = ss.getSheetByName("ROSS_OOU_Import")
var numRows = unitsoou.getDataRange();
var names = unitsoou.getRange(2, 4, 200).getDisplayValues();
var sheetName = PropertiesService.getScriptProperties().getProperty("1");
var unitSched = ss.getSheetByName(sheetName);
PropertiesService.getScriptProperties().setProperty("1", "UNIT_427")
var currentDate = Utilities.formatDate(new Date(), "GMT+1", "MM/dd/yyyy");
var changeDate = unitSched.getRange(4,38).getValue();
var newChangeDate = new Date(changeDate.getTime() + 3600000*24)
var newChangeDate = Utilities.formatDate(newChangeDate, "GMT+1", "MM/dd/yyyy");
if (newChangeDate == currentDate) {
var wp = unitSched.getRange(1,1).getValue();
wp = wp + 1
var newSheetName = "UNIT_" + wp
PropertiesService.getScriptProperties().setProperty("1",newSheetName)
unitSched = ss.getSheetByName(newSheetName)
}
unitSched.getRange(7,2,530,3).clearContent()
for (i =7; i <= 530; ++i) {
var name2 = unitSched.getRange(i, 40).getValue()
if (name2 != "#N/A" & name2 != "") {
var findName = ArrayLib.indexOf(names, 0, name2);
if (findName >= 0){
var incident = unitsoou.getRange(findName + 2 , 1).getDisplayValue()
var reqNumber = unitsoou.getRange(findName + 2, 3).getDisplayValue()
unitSched.getRange(i, 2).setValue("OOU")
unitSched.getRange(i, 3).setValue(incident)
unitSched.getRange(i, 4).setValue(reqNumber)
}
}
}
}
function onOpen() {
var ui = SpreadsheetApp.getUi();
// Or DocumentApp or FormApp.
ui.createMenu('Run ROSS OOU')
.addItem('ROSS OOU', 'OOU')
.addToUi();
}
解释/问题:
最初,我以为你打错了,但我才意识到你正在使用这个外部库:2D Arrays Library。
很可能您还没有安装该脚本的库。那么,在这种情况下,您可以按照我提供的 link 中的说明进行操作。
然而,阅读这个库的文档,我发现 ArrayLib.indexOf(names, 0, name2)
是如何工作的:
基本上你传递 names
这是你的二维数组(但在这种情况下是一个列数组),然后你传递索引,它是要查找的列号(在你的情况下 0
列)然后 name2
是要搜索的值。嗯,你不需要图书馆来做到这一点。可以自己直接使用内置的indexOf
方法
解决方案:
替换:
var findName = ArrayLib.indexOf(names, 0, name2);
搭配:
var findName = names.flat().indexOf(name2);
本质上,我们直接flatten the array to make it 1D
so we can then work with indexOf并获取name2
出现在names
中的第一个索引,如果不存在则获取-1
。
这将执行 helper/library 代码将执行的操作,您不再依赖于此外部库。
假设您的其余代码可以正常工作,并且据我所知,您没有在其他任何地方使用此 ArrayLib
库的方法,您的代码在之后应该可以正常工作这个修改。
请记住,您的代码需要大量改进,因为它迭代地使用 API 方法并且它不遵守 Best Practices。但是,代码的优化与您的问题或本网站无关(除非那是解决方案本身的一部分)。我建议您学习一些 Google Apps 脚本,这样您就可以优化您的代码,而且在需要时 maintain/modify 它也可以。
我是剧本写作的初学者。基本上我已经为我编写了几个脚本,多年来我一直能够管理这些脚本。然而,我使用 运行 多年的脚本突然停止工作。我所知道的一切都没有改变。 (老实说,我不知道我在看什么,甚至无法识别是否有东西)请如果有人可以提供帮助,我们将不胜感激。 ReferenceError:未定义 ArrayLib(第 50 行,文件“代码”) 拜托拜托
function OOU() {
var ss = SpreadsheetApp.openById("1L9f8wx3OYnry_UocEpBapuEmismMd6XYBO1Kl9e4duE");
var unitsoou = ss.getSheetByName("ROSS_OOU_Import")
var numRows = unitsoou.getDataRange();
var names = unitsoou.getRange(2, 4, 200).getDisplayValues();
var sheetName = PropertiesService.getScriptProperties().getProperty("1");
var unitSched = ss.getSheetByName(sheetName);
PropertiesService.getScriptProperties().setProperty("1", "UNIT_427")
var currentDate = Utilities.formatDate(new Date(), "GMT+1", "MM/dd/yyyy");
var changeDate = unitSched.getRange(4,38).getValue();
var newChangeDate = new Date(changeDate.getTime() + 3600000*24)
var newChangeDate = Utilities.formatDate(newChangeDate, "GMT+1", "MM/dd/yyyy");
if (newChangeDate == currentDate) {
var wp = unitSched.getRange(1,1).getValue();
wp = wp + 1
var newSheetName = "UNIT_" + wp
PropertiesService.getScriptProperties().setProperty("1",newSheetName)
unitSched = ss.getSheetByName(newSheetName)
}
unitSched.getRange(7,2,530,3).clearContent()
for (i =7; i <= 530; ++i) {
var name2 = unitSched.getRange(i, 40).getValue()
if (name2 != "#N/A" & name2 != "") {
var findName = ArrayLib.indexOf(names, 0, name2);
if (findName >= 0){
var incident = unitsoou.getRange(findName + 2 , 1).getDisplayValue()
var reqNumber = unitsoou.getRange(findName + 2, 3).getDisplayValue()
unitSched.getRange(i, 2).setValue("OOU")
unitSched.getRange(i, 3).setValue(incident)
unitSched.getRange(i, 4).setValue(reqNumber)
}
}
}
}
function onOpen() {
var ui = SpreadsheetApp.getUi();
// Or DocumentApp or FormApp.
ui.createMenu('Run ROSS OOU')
.addItem('ROSS OOU', 'OOU')
.addToUi();
}
解释/问题:
最初,我以为你打错了,但我才意识到你正在使用这个外部库:2D Arrays Library。
很可能您还没有安装该脚本的库。那么,在这种情况下,您可以按照我提供的 link 中的说明进行操作。
然而,阅读这个库的文档,我发现 ArrayLib.indexOf(names, 0, name2)
是如何工作的:
基本上你传递 names
这是你的二维数组(但在这种情况下是一个列数组),然后你传递索引,它是要查找的列号(在你的情况下 0
列)然后 name2
是要搜索的值。嗯,你不需要图书馆来做到这一点。可以自己直接使用内置的indexOf
方法
解决方案:
替换:
var findName = ArrayLib.indexOf(names, 0, name2);
搭配:
var findName = names.flat().indexOf(name2);
本质上,我们直接flatten the array to make it 1D
so we can then work with indexOf并获取name2
出现在names
中的第一个索引,如果不存在则获取-1
。
这将执行 helper/library 代码将执行的操作,您不再依赖于此外部库。
假设您的其余代码可以正常工作,并且据我所知,您没有在其他任何地方使用此
ArrayLib
库的方法,您的代码在之后应该可以正常工作这个修改。
请记住,您的代码需要大量改进,因为它迭代地使用 API 方法并且它不遵守 Best Practices。但是,代码的优化与您的问题或本网站无关(除非那是解决方案本身的一部分)。我建议您学习一些 Google Apps 脚本,这样您就可以优化您的代码,而且在需要时 maintain/modify 它也可以。