返回匹配数组的索引不工作-Javascript Google Apps脚本
我有一个电子表格,第1行的每个单元格都有日期 只要列与今天的日期匹配,我就要返回列号。第一个标题从单元格B1开始 我正在使用下面的命令,我可以让它工作,但是当我改为“returni”时,它总是返回“0”返回匹配数组的索引不工作-Javascript Google Apps脚本,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我有一个电子表格,第1行的每个单元格都有日期 只要列与今天的日期匹配,我就要返回列号。第一个标题从单元格B1开始 我正在使用下面的命令,我可以让它工作,但是当我改为“returni”时,它总是返回“0” function getColumnIndex() { var spreadsheet = SpreadsheetApp.getActive(); var sheet = spreadsheet.getActiveSheet(); var lastColumn = sheet.get
function getColumnIndex() {
var spreadsheet = SpreadsheetApp.getActive();
var sheet = spreadsheet.getActiveSheet();
var lastColumn = sheet.getLastColumn();
var data = sheet.getRange(1,2,1,lastColumn).getValues(); //create an array of data from row 1
for (var i = 0; i <= data.length; i++) {
var dateToday = Utilities.formatDate(new Date(), "EST", "MM/dd/yyyy")
if (data[i] == dateToday) {break};
{
return i;
}
}
}
函数getColumnIndex(){
var电子表格=SpreadsheetApp.getActive();
var sheet=spreadsheet.getActiveSheet();
var lastColumn=sheet.getLastColumn();
var data=sheet.getRange(1,2,1,lastColumn).getValues();//从第1行创建数据数组
对于(var i=0;i问题/解释:
var data=sheet.getRange(1,2,1,lastColumn).getValues();
返回一个2D数组data[i]
返回一个实际引用该行的1D数组。要解决此问题,将其转换为1D的数组:
var data = sheet.getRange(1,2,1,lastColumn).getDisplayValues().flat();
i=0
条件,因为您在它后面加了一个分号;
。此外,不需要break
,因为在return
语句之后不会执行任何操作:if (data[i] == dateToday) {break};
{
return i;
}
与
if (data[i] == dateToday)
{
return i;
}
getDisplayValues()
来确保比较的是显示的值
而不是日期的值解决方案: 函数getColumnIndex(){ var电子表格=SpreadsheetApp.getActive(); var sheet=spreadsheet.getActiveSheet(); var lastColumn=sheet.getLastColumn(); var data=sheet.getRange(1,2,1,lastColumn).getDisplayValues().flat();//从第1行创建一个数据数组
对于(var i=0;i)这是一个日期格式问题,因此您的比较不匹配吗?要测试这一点,而不是“return i”,您可以尝试返回“data[2]”,例如,查看该格式是否与您执行“return dateToday”时得到的格式匹配?只是一个想法…另外,我最近没有做太多编码-是否有可能I的值丢失(设置为零)在你打破FOR循环之后?太棒了,我读到了一些关于它生成2D数组的内容,但不知道如何处理这些信息——这就是为什么每次匹配时我都会得到0的索引返回值——因为第一行是0,所以它给出了正确的返回索引,我只是不知道我在做什么。也感谢上面的指针去掉分号,移动断点。今天我花了好几个小时研究如何独立完成这项工作,而我对气体一无所知,但有趣的是,知道自己在做什么的人可以立即看到它并计算出来out@823g4n8901很高兴它帮助您解决了问题。这些错误可能发生在任何人身上。无需担心:)GAS需要一点练习,你会成功的。:)1.
break
语句无法访问。一旦返回执行,break
就没用了。2.你应该提到为什么使用getDisplayValues()
@TheMaster true,my bad:)谢谢
function getColumnIndex() {
var spreadsheet = SpreadsheetApp.getActive();
var sheet = spreadsheet.getActiveSheet();
var lastColumn = sheet.getLastColumn();
var data = sheet.getRange(1,2,1,lastColumn).getDisplayValues().flat(); //create an array of data from row 1
for (var i = 0; i <= data.length; i++) {
var dateToday = Utilities.formatDate(new Date(), "EST", "MM/dd/yyyy")
if (data[i] == dateToday)
{
return i;
// return i+2; // if you want to get the column number instead.
}
}
}
function getColumnIndexForToday() {
const ss=SpreadsheetApp.getActive();
const sh=ss.getActiveSheet();
const shsc=2;
const offset=0;//0 if you want the index from column B 1 if you want the index from ColumnA
const data=sh.getRange(1,shsc,1,sh.getLastColumn()-shsc+1).getDisplayValues()[0];//assuming format is "MM/dd/yyyy"
var dObj={};
data.forEach(function(h,i){dObj[h]=i+offset;});//You really can just do this once and then use it repeatedly
var dateToday = Utilities.formatDate(new Date(), "EST", "MM/dd/yyyy")
return dObj[Utilities.formatDate(new Date(),Session.getScriptTimeZone(),"MM/dd/yyyy")];
}