indexOf() 在数组中找不到值
indexOf() doesn't find the value in array
基于此 post,我正在研究概念证明,以通过 Google 表单捕获项目请求,通过电子邮件发送以供批准,并将批准结果发回相应的行在 Google sheet 中。该行是从数组中搜索的,使用时间戳作为键。
我面临两个挑战:首先,数组中的时间戳采用不同的格式,有时相差 1 秒。我通过调整格式以匹配数组值的外观和 运行 如果第一次时间戳搜索失败则进行第二次搜索来对此进行调整。我希望这是万无一失的,但如果有更好的方法,请告诉我。我不明白为什么有时会有 1 秒的差异。
我遇到了 第二个挑战:我根本无法在数组 中成功搜索时间戳。 indexOf() 始终 returns 值为 -1.
将不胜感激任何帮助。
需要的话请详细一点,我是新手
这是我的代码:
function sendEmail(e) {
// Response columns: Timestamp Requester Email Item Cost
var email = e.namedValues["Requester Email"];
var item = e.namedValues["Item"];
var cost = e.namedValues["Cost"];
var timestamp = e.namedValues["Timestamp"];
var url = ScriptApp.getService().getUrl();
// Enhancement: include timestamp to coordinate response
var options = '?approval=%APPROVE%×tamp=%TIMESTAMP%&reply=%EMAIL%'
.replace("%TIMESTAMP%",encodeURIComponent(e.namedValues["Timestamp"]))
.replace("%EMAIL%",e.namedValues["Requester Email"])
var approve = url+options.replace("%APPROVE%","Approved");
var reject = url+options.replace("%APPROVE%","Rejected");
var html = "<body>"+
"<h2>Please review</h2><br />"+
"Request from: " + email + "<br />"+
"For: "+item +", at a cost of: $" + cost + "<br /><br />"+
"<a href="+ approve +">Approve</a><br />"+
"<a href="+ reject +">Reject</a><br />"+
"</body>";
MailApp.sendEmail(Session.getEffectiveUser().getEmail(),
"Approval Request",
"Requires html",
{htmlBody: html});
}
function doGet(e) {
var answer = (e.parameter.approval === 'Approved') ? 'Buy it!' : 'Not this time, Keep saving';
var timestamp = e.parameter.timestamp;
var newtimestamp = Utilities.formatDate(new Date(timestamp), "GMT+8", "EEE MMM dd yyyy HH:mm:ss 'GMT+0800 (SGT)'"); //reformat timestamp to match the ones in the data array
var approvalCol = 5;
MailApp.sendEmail(e.parameter.reply, "Purchase Request",
"Your manager said: "+ answer);
// Update approval status back to the sheet
var wsID = "<myworksheetID>";
var sheet = SpreadsheetApp.openById(wsID).getSheetByName("Requests");
var data = sheet.getDataRange().getValues();
var oneColArray = new Array();
for(i=0;i<data.length;++i){
oneColArray.push(data[i][0]); // taking index 0 means I'll get column A of each row and put it in the new array
}
var row = oneColArray.indexOf(newtimestamp);
Logger.log("\ntimestamp: " + timestamp + "\n\n" + "newtimestamp: " + newtimestamp + "\n\n" + "oneColArray: \n" + oneColArray);
if (row < 0) { //not found
//Lower timestamp by 1 second. Sometimes there is a 1-second difference than the one in the array. I don't know why
var dateString = Utilities.formatDate(new Date(timestamp), "GMT+8",'EEE, d MMM yyyy HH:mm:ss');
var date = new Date(dateString);
var revisedtimestamp = new Date((date.getTime() - (1/(24*60*60)*1000)));
// now search again using the adjusted timestamp
var row = oneColArray.indexOf(revisedtimestamp);
if (row < 0) {
Logger.log("\ntimestamp: " + timestamp + "\n\n" + "newtimestamp: " + newtimestamp + "\n\n" + "oneColArray: \n" + oneColArray + "\n\n" + "revisedtimestamp: " + revisedtimestamp);
throw new Error ("Request not found in list.");
} else {
sheet.getRange(row + 1, approvalCol).setValue(e.parameter.approval);
}
} else {
sheet.getRange(row + 1, approvalCol).setValue(e.parameter.approval);
}
}
我找到了基于此 post 的解决方案。
我更改了这一行:
var row = oneColArray.indexOf(newtimestamp);
为此将数组转换为字符串,indexOf() return是它找到第一次出现时间戳的起点。根据 return 值,我刚刚计算出它在工作表中的行数:
var row = oneColArray.join().indexOf(newtimestamp);
我更喜欢的另一个变体是循环遍历数据数组的时间戳列,在每个循环中,在执行 indexOf() 之前将值转换为字符串。我只需要将 1 添加到 [i] 即可获得工作表中的实际行。
for (var i = 0; i < data.length; ++i) {
var row = data[i][0].toString().indexOf(newtimestamp);
if (row > -1) {
var a = i;
break;
}
}
基于此 post,我正在研究概念证明,以通过 Google 表单捕获项目请求,通过电子邮件发送以供批准,并将批准结果发回相应的行在 Google sheet 中。该行是从数组中搜索的,使用时间戳作为键。
我面临两个挑战:首先,数组中的时间戳采用不同的格式,有时相差 1 秒。我通过调整格式以匹配数组值的外观和 运行 如果第一次时间戳搜索失败则进行第二次搜索来对此进行调整。我希望这是万无一失的,但如果有更好的方法,请告诉我。我不明白为什么有时会有 1 秒的差异。
我遇到了 第二个挑战:我根本无法在数组 中成功搜索时间戳。 indexOf() 始终 returns 值为 -1.
将不胜感激任何帮助。 需要的话请详细一点,我是新手
这是我的代码:
function sendEmail(e) {
// Response columns: Timestamp Requester Email Item Cost
var email = e.namedValues["Requester Email"];
var item = e.namedValues["Item"];
var cost = e.namedValues["Cost"];
var timestamp = e.namedValues["Timestamp"];
var url = ScriptApp.getService().getUrl();
// Enhancement: include timestamp to coordinate response
var options = '?approval=%APPROVE%×tamp=%TIMESTAMP%&reply=%EMAIL%'
.replace("%TIMESTAMP%",encodeURIComponent(e.namedValues["Timestamp"]))
.replace("%EMAIL%",e.namedValues["Requester Email"])
var approve = url+options.replace("%APPROVE%","Approved");
var reject = url+options.replace("%APPROVE%","Rejected");
var html = "<body>"+
"<h2>Please review</h2><br />"+
"Request from: " + email + "<br />"+
"For: "+item +", at a cost of: $" + cost + "<br /><br />"+
"<a href="+ approve +">Approve</a><br />"+
"<a href="+ reject +">Reject</a><br />"+
"</body>";
MailApp.sendEmail(Session.getEffectiveUser().getEmail(),
"Approval Request",
"Requires html",
{htmlBody: html});
}
function doGet(e) {
var answer = (e.parameter.approval === 'Approved') ? 'Buy it!' : 'Not this time, Keep saving';
var timestamp = e.parameter.timestamp;
var newtimestamp = Utilities.formatDate(new Date(timestamp), "GMT+8", "EEE MMM dd yyyy HH:mm:ss 'GMT+0800 (SGT)'"); //reformat timestamp to match the ones in the data array
var approvalCol = 5;
MailApp.sendEmail(e.parameter.reply, "Purchase Request",
"Your manager said: "+ answer);
// Update approval status back to the sheet
var wsID = "<myworksheetID>";
var sheet = SpreadsheetApp.openById(wsID).getSheetByName("Requests");
var data = sheet.getDataRange().getValues();
var oneColArray = new Array();
for(i=0;i<data.length;++i){
oneColArray.push(data[i][0]); // taking index 0 means I'll get column A of each row and put it in the new array
}
var row = oneColArray.indexOf(newtimestamp);
Logger.log("\ntimestamp: " + timestamp + "\n\n" + "newtimestamp: " + newtimestamp + "\n\n" + "oneColArray: \n" + oneColArray);
if (row < 0) { //not found
//Lower timestamp by 1 second. Sometimes there is a 1-second difference than the one in the array. I don't know why
var dateString = Utilities.formatDate(new Date(timestamp), "GMT+8",'EEE, d MMM yyyy HH:mm:ss');
var date = new Date(dateString);
var revisedtimestamp = new Date((date.getTime() - (1/(24*60*60)*1000)));
// now search again using the adjusted timestamp
var row = oneColArray.indexOf(revisedtimestamp);
if (row < 0) {
Logger.log("\ntimestamp: " + timestamp + "\n\n" + "newtimestamp: " + newtimestamp + "\n\n" + "oneColArray: \n" + oneColArray + "\n\n" + "revisedtimestamp: " + revisedtimestamp);
throw new Error ("Request not found in list.");
} else {
sheet.getRange(row + 1, approvalCol).setValue(e.parameter.approval);
}
} else {
sheet.getRange(row + 1, approvalCol).setValue(e.parameter.approval);
}
}
我找到了基于此 post 的解决方案。
我更改了这一行:
var row = oneColArray.indexOf(newtimestamp);
为此将数组转换为字符串,indexOf() return是它找到第一次出现时间戳的起点。根据 return 值,我刚刚计算出它在工作表中的行数:
var row = oneColArray.join().indexOf(newtimestamp);
我更喜欢的另一个变体是循环遍历数据数组的时间戳列,在每个循环中,在执行 indexOf() 之前将值转换为字符串。我只需要将 1 添加到 [i] 即可获得工作表中的实际行。
for (var i = 0; i < data.length; ++i) {
var row = data[i][0].toString().indexOf(newtimestamp);
if (row > -1) {
var a = i;
break;
}
}