这应该是一个非常简单的脚本,可以在3列之间更改列的标题。我让它工作一次,但是现在出现了一个我不明白的错误:
ReferenceError:未定义“今天”。 (第10行,文件“代码”)
代码如下:
function Progressions() {
var workoutSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Workouts");
var Increment = workoutSheet.getRange(2, 1, 1, 3).getValues();
var newRoutine =[[]]
if (Increment == [[Today,,]]){
var newRoutine = [[ ,Today, ]]
Increment.setValues(newRoutine);
} else {
if (Increment == [[,Today,]]){
var newToday = [[,,Today]]
Increment.setValues(newRoutine);
} else {
if (Increment == [[,,Today]]){
var newToday = [[Today,,]]
Increment.setValues(newRoutine);
}
}
}
显然,今天并没有定义,因为那仅仅是数组的内容。
我认为此脚本应该只更改
newToday
数组的内容,然后将其输入todayIncrement
范围。有什么想法可以消除此错误并实现目标吗?
最佳答案
有几种原因导致代码无法正常运行,例如“ Today”,但在调用.getValues();
的数组中也不起作用,返回的数组将类似于[["","Today",""]]
您不能使用Increment.setValues(------);
,因为increment
是一个数组而不是范围对象。
应该构造if语句
if(-----){
} else if (-----) {
} else {
}
此代码按您的要求执行:
function Progressions() {
var workoutSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Workouts");
var range = workoutSheet.getRange(2, 1, 1, 3);
var increment = range.getValues();
var newRoutine;
var testValue = "Today";
if (increment[0][0] == testValue) {
newRoutine = [["", "Today", ""]];
} else if (increment[0][1] == testValue) {
newRoutine = [["", "", "Today"]];
} else if (increment[0][2] == testValue) {
newRoutine = [["Today", "", ""]];
}
range.setValues(newRoutine);
}
if-else链的替代实现,它易于扩展(例如,如果您有365种不同的锻炼作为列,则上述方法需要365个
if
-else
检查),但需要更多的JavaScript知识来理解怎么运行的:function Progressions() {
const workoutSheet = SpreadsheetApp.getActive().getSheetByName("Workouts"),
// 1 column per workout (here we have 3).
headerRange = workoutSheet.getRange(2, 1, 1, 3),
// Assume headers are in the range's first row.
headers = headerRange.getValues()[0],
newRoutine = [];
// Use Array#indexOf to do all the nasty "if-else if" checking.
const searchValue = "Today";
const columnIndex = headers.indexOf(searchValue);
if (columnIndex === -1)
throw new Error("'" + searchValue + "' not found in headers ('" + headerRange.getA1Notation() + "').");
// Set default header values (no Array#fill in Apps Script yet).
headers.forEach(function (s) { newRoutine.push(""); });
// Use addition and the modulus operator to increment and wrap.
const newIndex = (columnIndex + 1) % newRoutine.length;
newRoutine[newIndex] = searchValue;
// Write the new header values.
headerRange.setValues( [newRoutine] );
}
关于javascript - 阵列项目上的ReferenceError,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50560569/