这应该是一个真正简单的脚本,在3列之间改变一列的标题。我让它工作过一次,但现在它出现了一个我不理解的错误:
ReferenceError:未定义“今日”。(第10行,文件"Code")
代码如下:
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);
}
}
}
显然,没有定义Today,因为这只是数组的内容。我认为这个脚本应该只更改newToday
数组的内容,然后将其输入到todayIncrement
范围中。
你知道我如何才能消除这个错误并实现我的目标吗?
发布于 2018-05-28 18:35:34
有几个原因导致你的代码不能工作,比如“今天”,但是在你调用.getValues();
的数组中,返回的数组将类似于[["","Today",""]]
你不能使用Increment.setValues(------);
,因为increment
是一个数组而不是一个range对象。
应构造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] );
}
https://stackoverflow.com/questions/50560569
复制相似问题