[英]Google Apps Script return array values and use them in a javascript function
[英]Return index of matched array not working - Javascript Google Apps Script
我有一个电子表格,第 1 行在每个单元格中都有日期
我想在该列与今天的日期匹配时返回列号。 第一个标题从单元格 B1 开始。
我正在使用以下内容,我可以让它工作,但是当我执行“返回 i”时,它总是返回“0”。
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;
}
}
}
现在,如果我将最后一行 'return i' 切换为 'return dateToday',该函数将起作用,它将返回正确的日期,因此我知道它匹配正确(如果我将行单元格更改为其他值,它将返回这些值,如果它火柴)。 当我输入'return i'时,我无法让它吐出索引号。
var data = sheet.getRange(1,2,1,lastColumn).getValues();
返回一个二维数组。 因此, data[i]
返回一个一维数组,它实际上是指该行。 要解决此问题,请展平数组以将其转换为 1D:
var data = sheet.getRange(1,2,1,lastColumn).getDisplayValues().flat();
if
条件在第一次迭代i=0
执行,因为您放置了一个分号;
紧随其后。 此外,不需要break
,因为在return
语句之后不会执行任何操作:替换:
if (data[i] == dateToday) {break};
{
return i;
}
和
if (data[i] == dateToday)
{
return i;
}
getDisplayValues()
来确保您比较的是显示的值而不是日期的值。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.
}
}
}
请记住, i
指的是数组的位置。 在 JavaScript 中,数组中的索引从0
开始。 此外,您的数据从第二列开始。 如果您希望脚本返回列数,请将return i
更改为return i+2
。
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")];
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.