जब मैं अन्य गुण प्राप्त कर सकता हूं तो मुझे किसी ऑब्जेक्ट से विशिष्ट संपत्ति प्राप्त करने में कोई समस्या है।

सबसे पहले, मेरे पास ऑब्जेक्ट की एक सरणी है जो Google स्प्रेडशीट से आती है।

मैं ऑब्जेक्ट की इस सरणी को प्राप्त करने के लिए इस कोड का उपयोग करता हूं:

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;
  }
}

ऑब्जेक्ट का ऐरे [प्लानिंग] है जहां प्रत्येक ऑब्जेक्ट इस प्रकार है {MSN: "नंबर के रूप में स्ट्रिंग", प्रारंभ करें: "स्ट्रिंग के रूप में दिनांक", अंत: "स्ट्रिंग के रूप में दिनांक", स्थिति: "स्ट्रिंग"} मुझे गुण चाहिए जी शीट्स से पुनर्प्राप्त होने पर एक स्ट्रिंग होने के लिए क्योंकि जावास्क्रिप्ट में दिनांक इनपुट प्रारूप बुरी तरह से पहचाना जाता है (मैं उन्हें "YYYY-MM-DDTHH: MM: SSZ" प्रारूप में फिर से काम करता हूं)।

अब समस्या नीचे दिए गए कोड में है। इस फ़ंक्शन में, Date_Emprunts इनपुट में है और प्रारंभ/समाप्ति के बीच होना चाहिए, और पोस्ट स्थिति के बराबर होना चाहिए, फिर एमएसएन वापस कर दिया जाता है।

फ़ंक्शन को प्रारंभ, अंत और स्थिति के मान प्राप्त करने में कोई समस्या नहीं है लेकिन एमएसएन को शून्य/अपरिभाषित के रूप में वापस कर दिया गया है ...

enter image description here

लेकिन जब मैं अपनी सरणी में देखता हूं, तो सभी गुण सही ढंग से भरे जाते हैं:

enter image description here

मेरे पास अभी कोई समाधान नहीं है।

अगर कोई नई दृष्टि ला सकता है, तो उसका स्वागत है :) आपकी रुचि के लिए धन्यवाद :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é";
        }
      }
    }
  }
}
1
Breton Gaëtan 14 सितंबर 2020, 12:08

2 जवाब

सबसे बढ़िया उत्तर

समाधान

स्प्रेडशीट UTF-8 BOM के साथ में एक csv फ़ाइल से आती है, एन्कोडिंग पहले 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){
...

मदद के लिए सभी को धन्यवाद!

0
Breton Gaëtan 16 सितंबर 2020, 12:36

आपके लॉग से, ऐसा लगता है कि MSN कुंजी ऑब्जेक्ट में मौजूद नहीं है।

संभावित कारण:

  • MSN के आस-पास की जगह
  • ज़ीरो चौड़ाई जॉइनर्स जैसे गैर प्रिंट करने योग्य वर्ण

डिबगिंग पर विचार करें जैसे:

const Planning = /*Mock Planning for running snippet here*/[{"Station": "P50", "MSN ": 560}]
const log_ = e => console.log(JSON.stringify(e));
const buggyObject = Planning[0];
const msn = "MSN";
const bKeys = Object.keys(buggyObject);
log_(bKeys);
log_(bKeys.includes(msn));
bKeys.forEach(key => {
  if(key.includes(msn)){
    console.log(`Is this really MSN? ${msn === key}`);
    console.log(`Is length equal? ${msn.length === key.length}`);
    console.log(`Are all characters equal? ${[...key].every((char,i)=>char===msn[i] || console.log(`Something wrong at position ${i}`))}`);
  }
})
1
TheMaster 14 सितंबर 2020, 20:05