Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 很难从对象中获取特定属性,而与其他对象没有问题_Javascript_Google Apps Script_Google Sheets - Fatal编程技术网

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这么固定?