मैनुअल एंट्री करने के लिए मेरे वर्तमान कोड के मामले में, जब मैं एक विषय का चयन करता हूं, एक समय में एक तिथि और इनपुट अधिकतम 4 छात्र आईडी (उदाहरण के लिए 1802001, 1802002, 1802004) और फिर एक विकल्प का चयन करें, यह सिर्फ ईमेल के साथ जुड़ता है पैटर्न (जैसे @ icte.bdu.ac.bd) और उन्हें पहले से चयनित गंतव्य विषय पत्रक में सम्मिलित करें।

मैं अब ईमेल पैटर्न (@icte.bdu.ac.bd) का उपयोग नहीं करना चाहता। मेरे वर्तमान कोड ठीक काम करते हैं, यह देखते हुए कि छात्रों के एक बैच के सभी ईमेल पते समान हैं (जैसे 1902001@ubd.ac.bd, 1902002@ubd.ac.bd)। हालांकि, कई संस्थान छात्र आईडी नंबर के आधार पर ईमेल पते प्रदान नहीं करते हैं, अक्सर यह tom@ubd.ac.bd या james@ubd.ac.bd जैसा होता है।

कृपया ध्यान दें कि डैशबोर्ड पर इनपुट करते समय छात्र आईडी समान होते हैं (संलग्न छवि देखें) और छात्र सूची शीट में भी लेकिन यह गंतव्य शीट (एचयूएम4105) में भिन्न होता है जैसे 1802001, 1802003, "रोल नंबर: 18.02.004 रेग नं। .:2018.11.000027"। हालांकि, छात्रों का ईमेल पता सभी जगहों पर समान होता है और इसे आधार के रूप में इस्तेमाल किया जाना चाहिए। वास्तव में यह एक छात्र उपस्थिति प्रणाली है जहां इनपुट आमतौर पर एंड्रॉइड ऐप से आते हैं। यदि कुछ छात्र उपस्थिति की रिपोर्ट करने से चूक जाते हैं, तो हम मैन्युअल प्रविष्टि करते हैं।

मैं जो करने की कोशिश कर रहा हूं, वह यह है कि जब मैं छात्र आईडी इनपुट करूंगा, तो अधिकतम 4 समय (जैसे 1802001, 1802003) यह वास्तव में उनके संबंधित ईमेल पते को Google शीट (छात्र सूची) से पहले चयनित विषय पत्रक में सम्मिलित करेगा (HUM4105) . स्टूडेंटलिस्ट शीट में कॉलम डी में एसआईडी और कॉलम एफ में ईमेल है। कृपया ध्यान दें कि एडिट ट्रिगर पहले से मौजूद है और जब एक निश्चित विकल्प चुना जाता है, तो निम्नलिखित कोड निष्पादित होता है।

कोड हैं:

function manualEntry(e){ 
    var spreadsheet = SpreadsheetApp.getActive();
      var dashboard = spreadsheet.getSheetByName("Dashboard");
      var sheetName = dashboard.getRange("F5").getValue(); 
      var mDate = dashboard.getRange("G5").getDisplayValue();
      var sheetw = dashboard.getRange("A8");
      var sheetw2 = dashboard.getRange("G8");
           
        if (e.range.getA1Notation() === 'K6' && e.range.getValue() === "Report 1P") {
          sheetw2.setValue('Manual entry process is up and running. Please Wait!').setFontColor('Red');
          onePeriodm();       
          sheetw.setValue('You may take class attendance now. Thank You!').setFontColor('Green');
          sheetw2.setValue('You may do manual entry now. Thank You!').setFontColor('Green');
        }
   }          
    
    function onePeriodm(){
    //for one period manual entry
      const srcSheetName = "Dashboard";
    
      // 1. Retrieve values from the source sheet.
      const ss = SpreadsheetApp.getActiveSpreadsheet();
      const srcSheet = ss.getSheetByName(srcSheetName);
      const [
        [, , , , , emailPattern],
        ,
        [courseCatalogId, dateString, ...studentIds],
      ] = srcSheet.getRange("F3:K5").getDisplayValues();
    
      // 2. Retrieve current values
      const dstSheet = ss.getSheetByName(courseCatalogId);
      const dstCurrentValues = dstSheet
        .getRange(`A2:C${dstSheet.getLastRow()}`) // expanded to include email column
        .getDisplayValues(); // not flattening since we have multiple columns now
    
      // 3. Convert the values for putting to the destination sheet.
      //    Do not include if there is already an email for this date in current values
      const dstValues = studentIds.reduce((array, studentId) => {
        const existingEntry = dstCurrentValues.find(
          (row) => row[0] === dateString && row[2] === studentId + emailPattern
        );
        if (studentId != "" && !existingEntry)
          array.push([
            dateString,
            Number(studentId),
            studentId + emailPattern,
            ,
            ,
            courseCatalogId,
          ]);
        return array;
      }, []);
    
      // 4. Put the converted values to the destination sheet.
      const index = dstCurrentValues.map((row) => row[0]).lastIndexOf(dateString);
      const row = index + 2;
      if (dstValues.length > 0){
         dstSheet.insertRowsAfter(row, dstValues.length);
         dstSheet.getRange(row + 1, 1, dstValues.length, dstValues[0].length).setValues(dstValues);
      }
-1
Tamjid Taha 27 अक्टूबर 2020, 10:30

2 जवाब

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

अभी आपका कोड आईडी को ईमेल पैटर्न के साथ जोड़ रहा है। इसलिए कोड दोनों ही मामलों में काम करे, इसके लिए आपको एक चेक इन करने की आवश्यकता होगी कि आईडी को ईमेल पैटर्न के साथ कब जोड़ा जाए और आईडी को पूरे ईमेल पते से कब बदला जाए। (मैं मान रहा हूं कि पूरा ईमेल पता कॉलम एफ में स्टूडेंटलिस्ट शीट में है।)

यदि पूरा ईमेल हमेशा सूचीबद्ध होता है, भले ही वह छात्र आईडी पर आधारित हो, तो मैं आईडी और ईमेल पैटर्न के संयोजन को पूरी तरह से हटा दूंगा और केवल पूरे ईमेल पते के साथ आईडी के प्रतिस्थापन का उपयोग करूंगा।

यहां वे चरण दिए गए हैं जिन्हें आपके कोड में लागू करने की आवश्यकता है:

  1. छात्रसूची कॉलम डी से एफ के माध्यम से सीमा प्राप्त करें। यह एक सरणी होगी (छात्र लिस्टअरे कहें)।
  2. छात्र आईडी की सरणी प्राप्त करें। (यदि आपने अपने डैशबोर्ड को अलग तरह से संरचित किया है, तो आप एक बार में केवल 4 करने के बजाय पंक्ति में जितनी चाहें उतनी आईडी सूचीबद्ध कर सकते हैं।)
  3. डुप्लिकेट के लिए आईडी की अपनी सरणी जांचें।
  4. आईडी सरणी के माध्यम से लूप करें और छात्र लिस्टअरे को छात्र लिस्टअरे पर आईडी द्वारा फ़िल्टर करें [0] छात्र लिस्टअरे [2] लौटा रहा है।
  5. जाँच फ़िल्टर परिणाम अपरिभाषित नहीं है।
  6. यदि फ़िल्टर परिणाम अपरिभाषित नहीं है, तो परिणाम को छात्र ईमेल के रूप में सेट करें।

संपादित करें


कोड में परिवर्तन के साथ उदाहरण पत्रक यहां दिया गया है:

https://docs.google.com/spreadsheets/d/146vRZ1QDGpnzhxnAuQ03qX4jTORZdj_piueW7ORfYDY/edit?usp=sharing

यहाँ onePeriodm() के लिए कोड है:

function onePeriodm(){
  //For protecting dashboard while scripts running
  var spreadsheet = SpreadsheetApp.getActive(); 
  
  //### new code ##########################################
  var studentListSheet = spreadsheet.getSheetByName("StudentList");
  var studentList = studentListSheet.getDataRange().getValues();
  var studentEmail = null;
  var tempEmail = null;
  //### end new code ######################################
  
  var dashboard = spreadsheet.getSheetByName("Dashboard");  
  var sheetw = dashboard.getRange("A8");
  var sheetw2 = dashboard.getRange("G8");  
  sheetw.setValue('Class Attendance is restricted now. Try Again Later!').setFontColor('Red');
   
  var rangem = dashboard.getRange("A4:K6");
  
  var timeZone = Session.getScriptTimeZone();
  var stringDate = Utilities.formatDate(new Date(), timeZone, 'dd/MM/yy HH:mm');
  //var me2 = Session.getEffectiveUser();
  var me2 = Session.getActiveUser().getEmail();
  var description = 'Scripts running on ' + stringDate + ' by ' + me2;
  
  //var me = Session.getEffectiveUser();
  //var description = 'Scripts are running by ' + me;
  var protectionm = rangem.protect().setDescription(description);  
  protectionm.removeEditors(protectionm.getEditors());
  protectionm.addEditor(me2);
  if (protectionm.canDomainEdit()) {
      protectionm.setDomainEdit(false);
  }  
  
  //Refreshing sheet with removing unprotectd data
  var spreadsheet = SpreadsheetApp.getActive();  
  var dashboard = spreadsheet.getSheetByName("Dashboard");  
  var sheetName = dashboard.getRange("F5").getValue(); 
  var sheet = spreadsheet.getSheetByName(sheetName);
  
  //For removing unprotected rows of data from a particular sheet  
  // 1. Retrieve data range.
    const dataRange = sheet.getDataRange();

    // 2. Create an object from the protected range. This is used for removing from the cleared rows.
    const protectedRanges = sheet.getProtections(SpreadsheetApp.ProtectionType.RANGE).map(e => {
      const r = e.getRange();
      const start = r.getRow();
      return {start: start, end: r.getNumRows() + start - 1};
    });

    // 3. Create range list for clearing rows using the object.
    let rangeList = [];
    for (let r = 2; r <= dataRange.getNumRows(); r++) {
      let bk = false;
      for (let e = 0; e < protectedRanges.length; e++) {
        if (protectedRanges[e].start == r) {
          r = protectedRanges[e].end;
          bk = true;
          break;
        }
      }
      if (!bk) rangeList.push(`A${r}:${r}`);
    }

    // 4. Delete the rows without the rows of the protected ranges.
    if (rangeList.length > 0) sheet.getRangeList(rangeList).getRanges().reverse().forEach(r => sheet.deleteRow(r.getRow()));
    //sheet.getRangeList(rangeList).getRanges().reverse().forEach(r => sheet.deleteRow(r.getRow()));
  

  //for one period manual entry
  const srcSheetName = "Dashboard";

  // 1. Retrieve values from the source sheet.
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const srcSheet = ss.getSheetByName(srcSheetName);
  const [
    [, , , , , emailPattern],
    ,
    [courseCatalogId, dateString, ...studentIds],
  ] = srcSheet.getRange("F3:K5").getDisplayValues();

  // 2. Retrieve current values
  const dstSheet = ss.getSheetByName(courseCatalogId);
  const dstCurrentValues = dstSheet
    .getRange(`A2:C${dstSheet.getLastRow()}`) // expanded to include email column
    .getDisplayValues(); // not flattening since we have multiple columns now

  // 3. Convert the values for putting to the destination sheet.
  //    Do not include if there is already an email for this date in current values
  const dstValues = studentIds.reduce((array, studentId) => {
    const existingEntry = dstCurrentValues.find(
      (row) => row[0] === dateString && +row[1] === +studentId //(row) => row[0] === dateString && row[2] === studentId + emailPattern //############# code change
  );
//### new code ##########################################
tempEmail = studentList.filter(function(a){return (+a[3]) == (+studentId);})[0];
if (tempEmail != undefined && tempEmail != null &&tempEmail != ""){
  studentEmail = tempEmail[5];
}else{
  studentEmail = studentId + emailPattern;
}
//### end new code ######################################

    if (studentId != "" && !existingEntry)
      array.push([
        dateString,
        Number(studentId),
        studentEmail,//studentId + emailPattern //############# code change
        ,
        ,
        courseCatalogId,
      ]);
    return array;
  }, []);

  // 4. Put the converted values to the destination sheet.
  const index = dstCurrentValues.map((row) => row[0]).lastIndexOf(dateString);
  const row = index + 2;
  if (dstValues.length > 0){
     dstSheet.insertRowsAfter(row, dstValues.length);
     dstSheet.getRange(row + 1, 1, dstValues.length, dstValues[0].length).setValues(dstValues);
  }

  //dstSheet.insertRowsAfter(row, dstValues.length);
  //dstSheet.getRange(row + 1, 1, dstValues.length, dstValues[0].length).setValues(dstValues); 
  protectionm.remove();  
  SpreadsheetApp.flush();
  
  srcSheet.getRange("F5").setValue("All"); 
  srcSheet.getRange("K6").setValue("Please Select"); 
  srcSheet.getRange("G5:K5").clearContent();
  srcSheet.getRange('G5').clearDataValidations();
  //srcSheet.getRange('G5').setValue(new Date()).setNumberFormat("yyyy-mm-dd");    
} 
1
JLMosher 29 अक्टूबर 2020, 22:29

आपका कार्य onEdit ट्रिगर का उपयोग करके पूरा किया जा सकता है।

कोड

// Copyright 2020 Google LLC.
// SPDX-License-Identifier: Apache-2.0

function onEdit(e) {
    let currentSheet = e.range.getSheet().getName();
    let valsToSearchIn = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('SHEET_WHERE_THE_IDS_ARE').getRange(ROW, COL, NO_ROWS, NO_COLS).getValues();

    if (currentSheet == 'SHEET_WHERE_YOU_INPUT_THE_IDS') {
        let inputValue = e.value;
        for (let i = 0; i < valsToSearchIn.length; i++)
            if (valsToSearchIn[i][0] == inputValue) 
                e.range.setValue(SpreadsheetApp.getActiveSpreadsheet().getSheetByName('SHEET_WHERE_YOU_INPUT_THE_IDS').getRange(i + ROW, COL).getValue());
            else
                SpreadsheetApp.getUi().alert('Please input a valid student id!');
    }
}

व्याख्या

उपरोक्त कोड उस शीट की पहचान करके काम करता है जिसमें e ईवेंट ऑब्जेक्ट का उपयोग करके एक संपादन किया गया है। यदि इस शीट का नाम SHEET_WHERE_YOU_INPUT_THE_IDS के समान नाम है, तो इनपुट किया गया मान inputValue चर में संग्रहीत है। बाद में, यह valsToSearchIn सरणी में खोज करता है - जो वह सरणी है जिसमें छात्र आईडी संग्रहीत किए जाते हैं, inputValue के लिए और यदि खोज सफल होती है, तो संबंधित ईमेल पता संपादित श्रेणी में सेट किया जाएगा . यदि आईडी नहीं मिलती है, तो उपयोगकर्ता को एक अलर्ट प्रदर्शित किया जाएगा।

ध्यान दें

कृपया ध्यान रखें कि आपको ऊपर दिए गए कोड को समायोजित करना होगा (विशेष रूप से रेंज और शीट के नाम) ताकि आपकी आवश्यकताओं के अनुरूप हो।

डेमो

  1. onEdit(e) ट्रिगर से पहले

SHEET_WHERE_THE_IDS_ARE

SHEET_WHERE_THE_IDS_ARE before

SHEET_WHERE_YOU_INPUT_THE_IDS

SHEET_WHERE_YOU_INPUT_THE_IDS before

  1. onEdit(e) ट्रिगर के बाद

SHEET_WHERE_YOU_INPUT_THE_IDS

SHEET_WHERE_YOU_INPUT_THE_IDS after

संदर्भ

0
ale13 27 अक्टूबर 2020, 15:16