• 0 הצבעות
    123 פוסטים
    81 צפיות
    י
    @nhfk-sbhtk אולי תנסה לעדכן את הקוד שלך ככה function doGet(e) { try { var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); var params = (e && e.parameter) ? e.parameter : {}; var phone = params.ApiPhone || ''; var extension = params.ApiExtension || ''; var what = params.what || ''; var apiTime = params.ApiTime || Math.floor(Date.now() / 1000); var nextFileResponse = ""; if (what !== "" && extension !== "") { var parts = what.split('/'); var fileNameWithExt = parts[parts.length - 1]; var currentFileNumber = parseInt(fileNameWithExt.replace('.wav', '')); if (!isNaN(currentFileNumber)) { var nextFileNumber = currentFileNumber + 1; var folderPath = extension.startsWith('/') ? extension : '/' + extension; nextFileResponse = "go_to_folder_and_play=" + folderPath + "," + nextFileNumber; } } var dateObj = new Date(apiTime * 1000); var rowData = [ Utilities.formatDate(dateObj, "Asia/Jerusalem", "dd/MM/yyyy"), Utilities.formatDate(dateObj, "Asia/Jerusalem", "HH:mm:ss"), phone, extension, "", // משך זמן (לא פעיל כרגע) what ]; sheet.appendRow(rowData); var finalOutput = nextFileResponse || "id_list_message=t-לא נמצא קובץ תקין"; return ContentService.createTextOutput(finalOutput) .setMimeType(ContentService.MimeType.TEXT); } catch (error) { return ContentService.createTextOutput("id_list_message=t-שגיאה כללית") .setMimeType(ContentService.MimeType.TEXT); } } תעשה פריסה מחדש. זה אמור לשלוח אותך לקובץ הבא (לגבי משך זמן לא מצאתי פתרון כעת)
  • עזרה בשליחת API לאחר השמעת קובץ

    פורום מפתחים API
    7
    0 הצבעות
    7 פוסטים
    21 צפיות
    י
    @CUBASE אבל זה לא מדוייק. כי נניח ששמעתי קובץ 013 אז זה תלוי מה הגדרתי בשלוחת ההשמעה, אם הוא ישמע בסדר עולה או בסדר יורד. כי אם זה בסדר עולה, אני יכול לכוון בקוד שייקח את הקובץ מפרמטר what +1. ואם זה בסדר יורד, אני יכול לעשות -1. אבל איך אני יכול לכתוב קוד שיטפל ב2 הצורות (כמובן, שאפשר תמיד לבדוק מה כתוב start בקובץ exe. - אבל אני מדבר בדרך המלך)
  • עזרה דחופה

    טלפונים ומערכות SIP
    2
    0 הצבעות
    2 פוסטים
    13 צפיות
    ש
    @אבי-היקר הסתדרת?
  • 3 הצבעות
    74 פוסטים
    2k צפיות
    B
    @פורום-מוזיקה אתה רוצה להשמיע אחרי צינתוק הודעה חדשה בשלוחה 1 אז אתה צריך בשלוחה שמקליטה לשלוחה 1 להגדיר מעבר לשלוחה שיש את ההגדרות שהוא הביא ומשמה חזרה לשלוחה שאתה מעוניין וכנ"ל לכל שלוחת הקלטות שמקליטה לשלוחה מסוימת צריך להגדיר מעבר לשלוחה של איפוס הפילטר ככה ישמעו שיש הודעה חדשה בשלוחהX
  • 19 הצבעות
    59 פוסטים
    3k צפיות
    B
    @ARISH ככל הידוע לי זה רק בתשלום או API שיסרוק כל X שניות
  • השמעה הודעה כשיש הודעה חדשה

    שאלות ועזרה הדדית
    14
    0 הצבעות
    14 פוסטים
    52 צפיות
    B
    @76402465453 1 אם אתה רוצה לכתוב משהו בלי קשר למישהו מסוים תלחץ על תגובה למעלה ולא על המאמר שהוא כתב זה שולח לי הודעה וזה סתם מטריד שזה חסר תועלת 2 אף אחד לא ביקש ממך שום דבר אם אתה לא מבין אתה יכול פשוט לא לכתוב כלום אין שום צורך סתם לכתוב
  • 2 הצבעות
    51 פוסטים
    1k צפיות
    ע
    @אופיר הוא העלה את זה ואני מכניס לפנקס רשימות ושומר כHTML וזה פותח אבל לא יודע למה זה לא עובד והקישורים שהוא הביא עבדו לי אתה יכול לנסות? <!DOCTYPE html> <html lang="he" dir="rtl"> <head> <meta charset="UTF-8"> <title>הורדת שלוחות למחשב</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"></script> <style> body { font-family: 'Segoe UI', Tahoma, sans-serif; margin: 20px; background-color: #f4f7f6; text-align: right; direction: rtl; } .container { max-width: 1100px; margin: auto; background: white; padding: 25px; border-radius: 12px; box-shadow: 0 4px 15px rgba(0,0,0,0.1); } .section { border: 1px solid #e0e0e0; padding: 15px; margin-bottom: 15px; border-radius: 8px; background: #fafafa; } #logArea { background: #1e1e1e; color: #d4d4d4; padding: 15px; border-radius: 5px; height: 250px; overflow-y: auto; font-family: 'Consolas', monospace; font-size: 13px; margin-top: 10px; } .log-info { color: #4fc3f7; } .log-success { color: #00ff00; font-weight: bold; } .log-error { color: #ff5252; } button { padding: 10px 20px; background: #3498db; color: white; border: none; cursor: pointer; border-radius: 5px; font-weight: bold; transition: background 0.3s; } button:hover { background: #2980b9; } button:disabled { background: #bdc3c7; } input { padding: 10px; margin: 5px; border: 1px solid #ccc; border-radius: 4px; font-size: 14px; } .token-input { width: 350px; } .config-input { width: 60px; text-align: center; } table { width: 100%; border-collapse: collapse; margin-top: 15px; } th, td { border: 1px solid #ddd; padding: 12px; text-align: right; } .progress-container { background: #e0e0e0; border-radius: 20px; height: 25px; margin: 15px 0; overflow: hidden; display: none; } .progress-bar { width: 0%; height: 100%; background: linear-gradient(90deg, #2ecc71, #27ae60); transition: width 0.3s; color: white; text-align: center; line-height: 25px; font-weight: bold; } </style> </head> <body> <div class="container"> <h2>הורדת מבנה שלוחות למחשב (ZIP)</h2> <div class="section"> <strong>⚙️ הגדרות:</strong> סרוק שלוחות בעלות <input type="number" id="digitCount" class="config-input" value="2" min="1" max="4"> ספרות. שם קובץ לשמירה: <input type="text" id="fileNameInput" placeholder="backup_ivr" value="backup_ivr"> </div> <div class="section"> <strong>1. פרטי המערכת</strong><br> <input type="text" id="srcToken" class="token-input" placeholder="הכנס טוקן מקור..."> <input type="text" id="srcPath" class="path-input" placeholder="נתיב (למשל /)" value="/"> <button onclick="loadFolder(document.getElementById('srcPath').value)">טען רשימת קבצים</button> </div> <div class="section"> <strong>2. ביצוע הורדה</strong><br> <button id="downloadBtn" onclick="startDownload()" disabled style="background:#27ae60;">בחר מיקום והורד ZIP</button> <div class="progress-container" id="progContainer"> <div id="progBar" class="progress-bar">0%</div> </div> <div id="logArea">מוכן...</div> </div> <div id="fileArea" style="display:none;"> <table id="fileTable"> <thead> <tr> <th style="width: 40px;"><input type="checkbox" id="masterCheck" checked onclick="toggleAll(this)"></th> <th>סוג</th> <th>שם</th> </tr> </thead> <tbody id="fileTableBody"></tbody> </table> </div> </div> <script> let currentViewPath = "/"; let zip = new JSZip(); function addLog(msg, type = '') { const logArea = document.getElementById('logArea'); const div = document.createElement('div'); div.className = `log-${type}`; div.innerHTML = `[${new Date().toLocaleTimeString()}] ${msg}`; logArea.appendChild(div); logArea.scrollTop = logArea.scrollHeight; } async function loadFolder(path) { const token = document.getElementById('srcToken').value; const digits = parseInt(document.getElementById('digitCount').value) || 2; const maxRange = Math.pow(10, digits) - 1; if (!token) { alert("נא להזין טוקן"); return; } currentViewPath = path; const tbody = document.getElementById('fileTableBody'); tbody.innerHTML = '<tr><td colspan="3">סורק...</td></tr>'; try { const res = await fetch(`https://www.call2all.co.il/ym/api/GetIVR2Dir?token=${token}&path=${path}`); const data = await res.json(); let filesMap = new Map(); if (data.files) data.files.forEach(f => filesMap.set(f.name, f)); const scanPromises = []; for (let i = 0; i <= maxRange; i++) { const n = i.toString(); if (filesMap.has(n)) continue; scanPromises.push( fetch(`https://www.call2all.co.il/ym/api/GetTextFile?token=${token}&what=ivr2:${path}/${n}/ext.ini`) .then(r => r.json()) .then(d => { if (d.contents !== undefined) filesMap.set(n, { name: n, fileType: "DIR" }); }) .catch(() => {}) ); } await Promise.all(scanPromises); tbody.innerHTML = ''; filesMap.forEach(f => { tbody.insertAdjacentHTML('beforeend', ` <tr> <td><input type="checkbox" class="file-check" data-name="${f.name}" data-type="${f.fileType}" checked></td> <td>${f.fileType === "DIR" || !isNaN(f.name) ? "שלוחה" : "קובץ"}</td> <td>${f.name}</td> </tr>`); }); document.getElementById('fileArea').style.display = 'block'; document.getElementById('downloadBtn').disabled = false; addLog("סריקה הושלמה.", "info"); } catch (e) { addLog("שגיאה בסריקה", "error"); } } async function downloadRecursive(token, path, name, type, zipFolder) { const sPath = `${path}/${name}`.replace(/\/+/g, '/'); const digits = parseInt(document.getElementById('digitCount').value) || 2; if (type === "DIR" || !isNaN(name)) { addLog(`מוריד שלוחה: ${sPath}`, "info"); const newFolder = zipFolder.folder(name); try { const iniRes = await fetch(`https://www.call2all.co.il/ym/api/GetTextFile?token=${token}&what=ivr2:${sPath}/ext.ini`); const iniData = await iniRes.json(); if (iniData.contents !== undefined) newFolder.file("ext.ini.txt", iniData.contents); } catch(e) {} const res = await fetch(`https://www.call2all.co.il/ym/api/GetIVR2Dir?token=${token}&path=${sPath}`); const data = await res.json(); let children = data.files || []; const subScan = []; for(let i=0; i <= Math.pow(10, digits)-1; i++) { const n = i.toString(); if(!children.find(c => c.name === n)) { subScan.push( fetch(`https://www.call2all.co.il/ym/api/GetTextFile?token=${token}&what=ivr2:${sPath}/${n}/ext.ini`) .then(r => r.json()) .then(d => { if(d.contents !== undefined) children.push({name: n, fileType: "DIR"}); }) ); } } await Promise.all(subScan); for (const f of children) { if (f.name === "ext.ini") continue; await downloadRecursive(token, sPath, f.name, f.fileType, newFolder); } } else { try { addLog(`מוריד קובץ: ${sPath}`, "info"); let finalName = name; const lowerName = name.toLowerCase(); const isAudio = lowerName.endsWith('.mp3') || lowerName.endsWith('.wav'); if (!isAudio && !lowerName.endsWith('.txt')) { finalName = name + ".txt"; } const dl = await fetch(`https://www.call2all.co.il/ym/api/DownloadFile?token=${token}&path=ivr2:${sPath}`); const blob = await dl.blob(); zipFolder.file(finalName, blob); } catch(e) { addLog(`שגיאה בהורדת קובץ ${sPath}`, "error"); } } } async function startDownload() { const token = document.getElementById('srcToken').value; const userFileName = document.getElementById('fileNameInput').value || 'backup_ivr'; const selected = Array.from(document.querySelectorAll('.file-check:checked')); if (selected.length === 0) { alert("לא נבחרו קבצים להורדה"); return; } // בקשת מיקום שמירה מהמשתמש לפני תחילת העבודה (בדפדפנים תומכים) let fileHandle = null; try { if ('showSaveFilePicker' in window) { fileHandle = await window.showSaveFilePicker({ suggestedName: `${userFileName}.zip`, types: [{ description: 'ZIP Archive', accept: {'application/zip': ['.zip']}, }], }); } } catch (err) { if (err.name === 'AbortError') return; // המשתמש ביטל את חלונית השמירה addLog("דפדפן לא תומך בבחירת מיקום מראש, ההורדה תתבצע כרגיל בסיום.", "info"); } zip = new JSZip(); document.getElementById('downloadBtn').disabled = true; document.getElementById('progContainer').style.display = 'block'; for (let i = 0; i < selected.length; i++) { const name = selected[i].getAttribute('data-name'); const type = selected[i].getAttribute('data-type'); await downloadRecursive(token, currentViewPath, name, type, zip); let p = Math.round(((i + 1) / selected.length) * 100); document.getElementById('progBar').style.width = p + '%'; document.getElementById('progBar').innerText = p + '%'; } addLog("מכין קובץ ZIP סופי...", "info"); const content = await zip.generateAsync({type:"blob"}); if (fileHandle) { // שמירה למיקום שהמשתמש בחר מראש const writable = await fileHandle.createWritable(); await writable.write(content); await writable.close(); } else { // הורדה רגילה לתיקיית ההורדות const link = document.createElement('a'); link.href = URL.createObjectURL(content); link.download = `${userFileName}.zip`; link.click(); } addLog("✅ ההורדה והשמירה הסתיימו בהצלחה!", "success"); document.getElementById('downloadBtn').disabled = false; } function toggleAll(source) { document.querySelectorAll('.file-check').forEach(cb => cb.checked = source.checked); } </script> </body> </html>
  • למה זה אומר המענה סגור כעת?

    עזרה הדדית למשתמשים מתקדמים
    1
    0 הצבעות
    1 פוסטים
    14 צפיות
    אין תגובות
  • 17 הצבעות
    40 פוסטים
    2k צפיות
    י
    אולי כבר הגיע הזמן להוסיף האפשרות גם לרייסלרים?
  • שיתוף מערכת ווירטואל פלוס

    שאלות ועזרה הדדית
    2
    0 הצבעות
    2 פוסטים
    14 צפיות
    7
    @המומחה לא מבין בזה...
  • סליקת אשראי מומלצת

    שאלות ועזרה הדדית
    3
    0 הצבעות
    3 פוסטים
    22 צפיות
    7
    @יעקב-1 לא מבין בזה
  • 0 הצבעות
    2 פוסטים
    18 צפיות
    7
    @amram כן שמעתי כך...
  • מודל ניתוביה בזיהוי שונה

    שאלות ועזרה הדדית
    2
    0 הצבעות
    2 פוסטים
    13 צפיות
    7
    @המומחה לא יודע איך עושים תפני לנציג שירות...
  • 0 הצבעות
    1 פוסטים
    18 צפיות
    אין תגובות
  • GPS טלפוני

    שאלות ועזרה הדדית
    18
    0 הצבעות
    18 פוסטים
    227 צפיות
    מ
    @יב כתב בGPS טלפוני: @BEN-ZION תנסה כאן https://open-bus-map-search.hasadna.org.il/he/public-appeal זה לא רשמי של משרד התחבורה, ואם יהיה יותר מידי קריאות API אז זה יקרוס והם יחסמו את השרת @y6714453 כתב בGPS טלפוני: @המומחה אין הגדרות API מיוחדות בשביל משרד התחבורה - בשלוחה צריך לשים הגדרות שיתחברו עם השרת שלך... ההגדרות אמורות להכיל את הפרמטרים שיישלחו לשרת, ושם השרת כבר יעשה את העבודה עם הAPI של משרד התחבורה. @ben-zion בשביל לעשות כל אפליקציה שמתכננת מסלולים צריך להתחבר לשני סוגי API של משרד התחבורה מידע סטטי GTFS מידע בזמן אמת SIRI חפש בגוגל תמצא על זה מידע, לגבי SIRI זה סגור לציבור וצריך להגיש בקשה לגישה
  • מה הסיפור של מספרי 1700?

    עזרה הדדית למשתמשים מתקדמים
    2
    0 הצבעות
    2 פוסטים
    33 צפיות
    מ
    @anti-malware זה גרושים
  • 0 הצבעות
    2 פוסטים
    23 צפיות
    A
    אין אף אחד שנתקל עם כזה שגיאה בעבר מה אני עושה? בבקשה תעזרו לי תודה רבה
  • 9 הצבעות
    42 פוסטים
    429 צפיות
    א
    לכל אלו שצריכים מפתח API של גוגל שיצרו איתי באופן אישי... Spoiler כתובת המייל שלי היא: a0733641352@gmail.com בהצלחה!!!
  • הגבלה על קובץ INI

    עזרה הדדית למשתמשים מתקדמים
    10
    0 הצבעות
    10 פוסטים
    64 צפיות
    S
    @יב כתב בהגבלה על קובץ INI: ואפי' אם הזיהוי ישאר הוא לא שואל אלא עונה בשגיאה... כתבתי את זה במפורש... אבל תודה רבה על הניסיון.
  • השיתוף בוצע בהצלחה

    שאלות ועזרה הדדית
    5
    0 הצבעות
    5 פוסטים
    72 צפיות
    B
    @יצחק-י. תנסה באתר הישן