Javascript 很难从对象中获取特定属性,而与其他对象没有问题
我有一个问题,从一个对象获取一个特定的属性,而我可以获取其他属性 首先,我有一个来自谷歌电子表格的对象数组 我使用以下代码获取此对象数组:Javascript 很难从对象中获取特定属性,而与其他对象没有问题,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我有一个问题,从一个对象获取一个特定的属性,而我可以获取其他属性 首先,我有一个来自谷歌电子表格的对象数组 我使用以下代码获取此对象数组: function DataToArrayOfObjects(Url_, SheetName) { //Transforme une G Sheets en Tableau d'objets //Url_ = ""; //Debug //SheetName = ""; // Debug var da
function DataToArrayOfObjects(Url_, SheetName) { //Transforme une G Sheets en Tableau d'objets
//Url_ = ""; //Debug
//SheetName = ""; // Debug
var data = [];
var ss = SpreadsheetApp.openByUrl(Url_);
var spreadsheetId = ss.getId();
var rangeName = SheetName + '!A1:ZZ';
var data = Sheets.Spreadsheets.Values.get(spreadsheetId, rangeName).values;
if (!data) {
Logger.log('No data found.');
} else {
var keys = data.shift(),
i = 0, k = 0,
obj = null,
output = [];
for (i = 0; i < data.length; i++) {
obj = {};
for (k = 0; k < keys.length; k++) {
obj[keys[k]] = data[i][k];
}
output.push(obj);
}
return output;
}
}
函数数据到ArrayOfobjects(Url,SheetName){//转换对象表中的表格
//Url_=“”;//调试
//SheetName=“;//调试
var数据=[];
var ss=SpreadsheetApp.openByUrl(Url_389;);
var spreadsheetId=ss.getId();
var rangeName=SheetName+'!A1:ZZ';
var data=Sheets.Spreadsheets.Values.get(spreadsheetId,rangeName).Values;
如果(!数据){
Logger.log('未找到数据');
}否则{
var keys=data.shift(),
i=0,k=0,
obj=null,
输出=[];
对于(i=0;i
对象的数组是[Planning],其中每个对象如下{MSN:“数字为字符串”,开始:“日期为字符串”,结束:“日期为字符串”,位置:“字符串”}
我希望在从G工作表检索时属性是字符串,因为日期输入格式在JavaScript中识别得很差(我将它们修改为“YYYY-MM-DDTHH:MM:SSZ”格式)
现在问题出在下面的代码中。在这个函数中,输入的日期必须在开始/结束之间,并且poste必须等于Position,然后返回MSN
函数获取start、end和position的值没有问题,但是MSN返回为null/undefined
但当我查看数组时,所有属性都已正确填充:
我还没有解决办法
如果有人能带来新的愿景,欢迎他:)
谢谢你的关注:D
function MSN_finder(Date_Emprunts,poste,Planning){
//debug
var Date_Emprunts = "23/07/2020 16:54:20";
var poste = "P50B";
var Planning = DataToArrayOfObjects("Sheet_Url","Sheet_Name");
//
var emprunt = new Date(Convert_Date_Nexess(Date_Emprunts));
for (var i=0; i <= Planning.length -1;i++){
if ( poste == Planning[i].Position ){
var start = Convert_Date_MSN(Planning[i].Start);
var end = Convert_Date_MSN(Planning[i].End);
if (emprunt>start && emprunt<end){
Logger.log(Planning[i].MSN);
if(Planning[i].MSN != null){
return Planning[i].MSN;
}else{
return "Non Trouvé";
}
}
}
}
}
函数MSN\u finder(日期、发布、计划){
//调试
var Date_Emprunts=“23/07/2020 16:54:20”;
var poste=“P50B”;
var规划=数据到ArrayOfobjects(“工作表Url”、“工作表名称”);
//
var emprunt=新日期(转换日期);
对于(var i=0;i start&&emprunt,似乎MSN
键不在对象中
可能的原因:
- MSN周围的空格
- 不可打印的字符,如零宽度连接符
考虑如下调试:
const Planning=/*此处运行代码段的模拟规划*/[{“Station”:“P50”,“MSN”:560}]
constloge=e=>console.log(JSON.stringify(e));
const buggyObject=规划[0];
const msn=“msn”;
const bKeys=Object.keys(buggyObject);
日志(bKeys);
日志(包括(msn));
bKeys.forEach(键=>{
if(包括关键字(msn)){
log(`这真的是MSN吗?${MSN===key}`);
log(`Is length equal?${msn.length===key.length}`);
console.log(`all characters equal?${[…key].every((char,i)=>char==msn[i]| | | console.log(`Something offer at position${i}'))}`);
}
})
解决方案
电子表格来自UTF-8中的csv文件,带有BOM,编码以前没有BOM
为了解决这个问题,我使用了以下代码来删除键中的BOM表
//in function DataToArrayOfObjects
...
var data = Sheets.Spreadsheets.Values.get(spreadsheetId, rangeName).values;
if (data[0][0].charCodeAt(0) === 0xFEFF) {
data[0][0] = data[0][0].substr(1);
}
if(!data){
...
谢谢大家的帮助!因此,在无法访问电子表格的情况下,我猜您获得的所有键都是正确的,但由于某些原因,您没有获得MSN
列上的值。当您记录数据对象时,您得到了什么?您是否获得了包括在内的所有值是的,我有所有的值。比如这里,返回计划前的日志。MSN:[20-09-15 10:53:36:492 CEST]{'MSN':'464',计划事件:'Station-50',位置:'P50B',开始:'09/07/2020 6:00',结束:'24/07/2020 12:00'}
我仍然不知道为什么要编辑:你可能会帮我找到一些东西,当我复制/粘贴登录在我代码中的MSN时,我在MSN键前有一个红点。经过一些调查,源电子表格来自一个CSV,它刚刚将编码从一个没有BOM的UTF-8更改为一个有BOM的UTF-8。简单但恶意的解决方案应该是作为答案而不是问题的一部分。感谢您的帮助!事实上,MSN不在我想要的对象中!日志:[“MSN”、“PlanningEvent”、“Position”、“Start”、“End”]
false
这真的是MSN吗?false
长度相等吗?false
位置0有什么错误
所有字符都相等吗?false
我一直在搜索解决!Haha@BretonGaëtan位置0表示第一个字符不相等。是的,好像我有一个不可打印的字符,就像你建议的那样ed…当我从日志中复制/粘贴密钥时,密钥名称中MSN前面有一个红点经过一些调查,源电子表格来自一个CSV,该CSV刚刚将编码从一个没有BOM的UTF-8更改为一个有BOM的UTF-8vicious@BretonGa这么固定?