जब मैं अन्य गुण प्राप्त कर सकता हूं तो मुझे किसी ऑब्जेक्ट से विशिष्ट संपत्ति प्राप्त करने में कोई समस्या है।
सबसे पहले, मेरे पास ऑब्जेक्ट की एक सरणी है जो 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 इनपुट में है और प्रारंभ/समाप्ति के बीच होना चाहिए, और पोस्ट स्थिति के बराबर होना चाहिए, फिर एमएसएन वापस कर दिया जाता है।
फ़ंक्शन को प्रारंभ, अंत और स्थिति के मान प्राप्त करने में कोई समस्या नहीं है लेकिन एमएसएन को शून्य/अपरिभाषित के रूप में वापस कर दिया गया है ...
लेकिन जब मैं अपनी सरणी में देखता हूं, तो सभी गुण सही ढंग से भरे जाते हैं:
मेरे पास अभी कोई समाधान नहीं है।
अगर कोई नई दृष्टि ला सकता है, तो उसका स्वागत है :) आपकी रुचि के लिए धन्यवाद :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é";
}
}
}
}
}
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){
...
मदद के लिए सभी को धन्यवाद!
आपके लॉग से, ऐसा लगता है कि 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}`))}`);
}
})