google-apps-script - स्प्रेडशीट से Google कैलेंडर ईवेंट बनाएं लेकिन डुप्लिकेट को रोकें




google-spreadsheet google-calendar (3)

आईडी इसे किसी भी व्यक्ति के लिए पोस्ट करना चाहती है जो इसका उपयोग करना चाहती है, मैंने स्क्रिप्ट को उस शीट में काम करने के लिए संशोधित किया है जिसका मैं पहले से उपयोग कर रहा था। डेट फॉर्मेट और इवेंट डुप्लिकेशंस कुछ ऐसे मुद्दे थे जिन्हें तय करने की आवश्यकता थी, लेकिन कुछ परीक्षणों के बाद यह काम कर रहा है कि यह कैसे काम कर रहा है। मैं नौकरियों को बुक करने के लिए इसका उपयोग करता हूं और उन्हें अपने कर्मचारियों के साथ साझा करता हूं जो मोबाइल हैं और निर्माण प्रकार काम करते हैं शहर। अगला कदम कैलेंडर घटनाओं को स्प्रेडशीट में खींचना है ताकि यह दोनों तरीकों से काम कर सके और मैं अपने फोन पर कैलेंडर ऐप का उपयोग फ्लाई पर नौकरियां बुक करने के लिए कर सकता हूं ताकि किसी के पास सभी कानों की कोई सलाह हो, मुझे अभी भी एक स्क्रिप्ट डालने की आवश्यकता है उसी प्रतिक्रिया में फॉर्म प्रतिक्रिया डेटा बनाएं और पूर्ण पंक्तियां जोड़ें जहां नौकरी संख्या मौजूदा डेटा को बरकरार रखने से मेल खाती है।

`function onOpen() {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var entries = [{
name : "Export Events",
functionName : "exportEvents"
}];     sheet.addMenu("Calendar Actions", entries);
};

function parseDate(s) {
var months = {jan:0,feb:1,mar:2,apr:3,may:4,jun:5,
            jul:6,aug:7,sep:8,oct:9,nov:10,dec:11};
var p = s.replace(".", "").split('-');
return new Date(p[2], months[p[1].toLowerCase()], p[0]);
}

/**
* Export events from spreadsheet to calendar
*/
function exportEvents() {
var sheet = SpreadsheetApp.getActiveSheet();

var headerRows = 6;  // Number of rows of header info (to skip)
var range = sheet.getDataRange();
var data = range.getDisplayValues();
//var calId = "Your calendar Id"; // PRODUCTION
var calId = "Your_calendar Id to test"; // TEST
var cal = CalendarApp.getCalendarById(calId);
//Logger.log(cal);
//Logger.log(data.length);
for (i=0; i<data.length; i++) {
if (i < headerRows) continue; // Skip header row(s)
if (data[i][0].length < 1) continue; // Skip if no content.

var row    = data[i];
Logger.log(row);
var date   = parseDate(row[0]);  // First column
//Logger.log(date);
var title  = row[1];           // Second column

var tstart = new Date();
var s = row[2].split(":");
tstart.setHours(s[0]);
tstart.setMinutes(s[1]);
tstart.setSeconds(s[2]);
tstart.setDate(date.getDate());
tstart.setMonth(date.getMonth());
tstart.setYear(date.getYear());

var tstop = new Date();
var e = row[3].split(":");
tstop.setHours(e[0]);
tstop.setMinutes(e[1]);
tstop.setSeconds(e[2]);

tstop.setDate(date.getDate());
tstop.setMonth(date.getMonth());
tstop.setYear(date.getYear());
var loc  = row[4];
var desc = row[5];
var id   = row[6];              // Sixth column == eventId
// Check if event already exists, update it if it does
var event = null;
if (id.length > 0) {
try {
event = cal.getEventSeriesById(id);
}
catch (e) {
// do nothing - we just want to avoid the exception when event doesn't            exist
} 
}
if (!event) {
//cal.createEvent(title, new Date("March 3, 2010 08:00:00"), new
Date("March 3, 2010 09:00:00"), {description:desc,location:loc});
var newEvent = cal.createEvent(title, tstart, tstop,                                     
{description:desc,location:loc}).getId();                     
var r = i + 1;
var cell = sheet.getRange("G" + r);
cell.setValue(newEvent);
}
else {
Logger.log(event);
event.setTitle(title);
event.setDescription(desc);
event.setLocation(loc);
// event.setTime(tstart, tstop); // cannot setTime on eventSeries.
// ... but we CAN set recurrence!
var recurrence = CalendarApp.newRecurrence().addDailyRule().times(1);
event.setRecurrence(recurrence, tstart, tstop);
}
debugger;
}
}

`

मैं एक स्क्रिप्ट लिखने की कोशिश कर रहा हूं जो Google स्प्रेडशीट से डेटा लेगा और मेरे Google कैलेंडर में ईवेंट बनायेगा।

मैंने ठीक काम किया लेकिन जब भी मैंने इसे चलाया तो यह डुप्लिकेट उत्पन्न करता था। तो अब मैं स्प्रेडशीट में एक कॉलम 17 बनाकर प्रत्येक पंक्ति के लिए स्वचालित रूप से उत्पादित अद्वितीय इवेंट आईडी के साथ इसे रोकने की कोशिश कर रहा हूं और फिर प्रत्येक बार स्क्रिप्ट चलाने के बाद यह प्रत्येक पंक्ति के लिए इवेंट आईडी देखेंगे और इसी घटना को हटा देगा यदि मैंने पंक्ति बदल दी है तो मूल डेटा या अद्यतन डेटा के साथ इसे पुन: प्रयास करने से पहले कैलेंडर में।

मैं किसी भी प्रकार की पटकथा के लिए नया हूं और इसे एक साथ जोड़ता हूं लेकिन अब दीवार पर टक्कर मार रहा हूं। क्या कोई इसे हल करने में मदद कर सकता है?

function CalInsert() {
    var cal = CalendarApp.getDefaultCalendar();
    var id = SpreadsheetApp.getActiveSheet().getRange(2,17).getValue();

    if (id != 0) {
        var event = cal.getEventSeriesById(id);
        event.deleteEventSeries();
    }

    var sheet = SpreadsheetApp.getActiveSheet();
    var startRow = 2; // First row of data to process
    var numRows = sheet.getLastRow(); // Number of rows to process
    var dataRange = sheet.getRange(startRow, 1, numRows, sheet.getLastColumn());
    var data = dataRange.getValues();

    for (i in data) {
        var row = data[i];
        var title = row[0]; // First column
        var desc = row[13]; // Second column
        var tstart = row[14];
        var tstop = row[15];

        var event = cal.createEvent(title, tstart, tstop, {description:desc});
        var eventid = event.getId();
        SpreadsheetApp.getActiveSheet().getRange(2,17).setValue(eventid);
    }
}

यह दो दिन पहले पूछे गए एक प्रश्न के समान है, जो कैलेंडर के साथ घटनाओं की एक स्प्रेडशीट सिंक्रनाइज़ करने के बारे में था। ऐसा लगता है कि आप स्प्रैडशीट को उन घटनाओं के स्वामी के रूप में मानना ​​चाहते हैं जो इसकी उत्पत्ति करते हैं, जो समस्या को काफी सरल बनाते हैं। आपको जो जवाब देना है , उसकी मूल बातें इस उत्तर में शामिल हैं। यदि आप मौजूदा कोड को बस संशोधित करना चाहते हैं, तो मुझे नीचे एक कार्यान्वयन मिला है।

मेरे पास इस ब्लॉग से कोड का एक संशोधित संस्करण है, जो स्प्रेडशीट में जानकारी से मेल खाने के लिए पूर्व-मौजूदा कैलेंडर प्रविष्टियों को संशोधित करेगा। मैंने अपनी स्प्रेडशीट को अलग-अलग व्यवस्थित किया है, और यह कोड में दिखाई देता है।

तिथि | शीर्षक | प्रारंभ समय | अंत समय | स्थान | विवरण | EventID

इवेंट आईडी कॉलम स्क्रिप्ट द्वारा भर जाता है जब नई घटनाएं बनाई जाती हैं, और उसके बाद बाद में इनवॉक्शंस में कैलेंडर से ईवेंट पुनर्प्राप्त करने के लिए उपयोग किया जाता है, जिससे डुप्लिकेशन से परहेज किया जाता है।

लिपि

/**
 * Adds a custom menu to the active spreadsheet, containing a single menu item
 * for invoking the exportEvents() function.
 * The onOpen() function, when defined, is automatically invoked whenever the
 * spreadsheet is opened.
 * For more information on using the Spreadsheet API, see
 * https://developers.google.com/apps-script/service_spreadsheet
 */
function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "Export Events",
    functionName : "exportEvents"
  }];
  sheet.addMenu("Calendar Actions", entries);
};

/**
 * Export events from spreadsheet to calendar
 */
function exportEvents() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var headerRows = 1;  // Number of rows of header info (to skip)
  var range = sheet.getDataRange();
  var data = range.getValues();
  var calId = "YOUR_CALENDAR_ID";
  var cal = CalendarApp.getCalendarById(calId);
  for (i=0; i<data.length; i++) {
    if (i < headerRows) continue; // Skip header row(s)
    var row = data[i];
    var date = new Date(row[0]);  // First column
    var title = row[1];           // Second column
    var tstart = new Date(row[2]);
    tstart.setDate(date.getDate());
    tstart.setMonth(date.getMonth());
    tstart.setYear(date.getYear());
    var tstop = new Date(row[3]);
    tstop.setDate(date.getDate());
    tstop.setMonth(date.getMonth());
    tstop.setYear(date.getYear());
    var loc = row[4];
    var desc = row[5];
    var id = row[6];              // Sixth column == eventId
    // Check if event already exists, update it if it does
    try {
      var event = cal.getEventSeriesById(id);
    }
    catch (e) {
      // do nothing - we just want to avoid the exception when event doesn't exist
    }
    if (!event) {
      //cal.createEvent(title, new Date("March 3, 2010 08:00:00"), new Date("March 3, 2010 09:00:00"), {description:desc,location:loc});
      var newEvent = cal.createEvent(title, tstart, tstop, {description:desc,location:loc}).getId();
      row[6] = newEvent;  // Update the data array with event ID
    }
    else {
      event.setTitle(title);
      event.setDescription(desc);
      event.setLocation(loc);
      // event.setTime(tstart, tstop); // cannot setTime on eventSeries.
      // ... but we CAN set recurrence!
      var recurrence = CalendarApp.newRecurrence().addDailyRule().times(1);
      event.setRecurrence(recurrence, tstart, tstop);
    }
    debugger;
  }
  // Record all event IDs to spreadsheet
  range.setValues(data);
}

हटाएं / मनोरंजन करें

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

इस विकल्प का उपयोग करने के लिए, बस मिलान कोड को इसके साथ बदलें:

// Check if event already exists, delete it if it does
try {
  var event = cal.getEventSeriesById(id);
  event.deleteEventSeries();
  row[6] = '';  // Remove event ID    
}
catch (e) {
  // do nothing - we just want to avoid the exception when event doesn't exist
}
//cal.createEvent(title, new Date("March 3, 2010 08:00:00"), new Date("March 3, 2010 09:00:00"), {description:desc,location:loc});
var newEvent = cal.createEvent(title, tstart, tstop, {description:desc,location:loc}).getId();
row[6] = newEvent;  // Update the data array with event ID
debugger;

टिप्पणियाँ

  • getEventSeriesById लिए प्रलेखन गलत तरीके से बताता है कि जब कोई मिलान घटना नहीं मिलती है, तो इसके बाद यह अपवाद फेंकता है, जब यह अपवाद फेंकता है। (बुरा!) तो मैंने तैराकी पर रखने के लिए इसे एक कोशिश / पकड़ ब्लॉक में संलग्न कर लिया है।
  • दुर्भाग्यवश, getEventSeriesById किसी ईवेंट को पुनर्प्राप्त करने के लिए काम करता है, यह एक EventSeries ऑब्जेक्ट देता है, जो setTime() विधि का समर्थन नहीं करता है। यदि आप घटनाओं का समय बदलने की उम्मीद नहीं करते हैं, तो यह ठीक है। अन्यथा, आप पुनरावृत्ति नियमों और समयों को सेट करके Event को Event में बदल सकते हैं, या पुराने ईवेंट को हटा सकते हैं और एक नया बना सकते हैं, जैसा कि हटाएं / मनोरंजन में दिखाया गया है। अंक 1154
  • स्प्रेडशीट हमेशा जीतती है। Google कैलेंडर के माध्यम से दर्ज किए गए किसी भी ईवेंट में परिवर्तन (प्रासंगिक फ़ील्ड में) स्क्रिप्ट द्वारा ओवरराइट किया जाएगा।

मैं getDataRange() बाद getDataRange() का उपयोग कर रहा हूं। पहला कार्य

डेटा मौजूद होने वाले आयामों के अनुरूप एक रेंज देता है

और दूसरा समारोह

इस सीमा में पंक्तियों की संख्या देता है।

var ss = SpreadsheetApp.getActiveSpreadsheet();
var ws = ss.getActiveSheet();
var lastRow = ws.getDataRange().getNumRows();

पीएस मुझे उम्मीद है कि यह सभी मामलों के लिए काम करता है।





google-apps-script google-spreadsheet google-calendar