לפני 9 חודשים

@צבי-ד-צ כתב בבמודל הקלטות - שם קובץ מוגדר מראש וכן תפריט לפני ההקלטה עצמה.:

@הלוי-הלוי אתה מעוניין שיהי' שמות לקבצים? כי אם כן זה גם בעיה בהשמעת קבצים שלא יוכל להשמיע את הקובץ (כי הוא לא ממוספר)

לא, כמו שכתבתי, הקבצים לא מיועדים להשמעה במודל השמעת קבצים אלא שיהיו באיזושהי תיקייה במערכת, אח"כ אשתמש בהם לבניית משפטים,
נניח שכל הקבצים נמצאים בתיקייה בשם "קבצים", וארצה לבנות בשלוחה הראשית קובץ M1000 לתפריט "להקלטות הקישו 1 לשמיעת הודעות 2"
אשתמש בקוד כזה:

/**
 * פונקציה ראשית שמורידה קבצים, מחברת אותם לקובץ אחד ואז מעלה אותו.
 */
function main() {
  const downloadPath = "ivr2:קבצים/";
  const files = ["ל.wav", "הקלטות.wav", "הקישו.wav", "1.wav", "ל.wav", "שמיעת הודעות.wav", "2.wav"];
  const uploadPath = "ivr2:M1000.wav";

  // הורדת הקבצים
  const fileBlob = downloadFile(downloadPath, files);
  
  // העלאת הקובץ המחובר
  uploadFile(uploadPath, fileBlob);
}

/**
 * מוריד קובץ מה-URL שצוין ומחזיר אותו כ-blob.
 *
 * @param {string} path - הנתיב של הקובץ להורדה.
 * @param {string[]} files - רשימת הקבצים להורדה.
 * @return {Blob} הקובץ שהורד כ-blob.
 */
function downloadFile(path, files) {
  
  var blobs = files.map(function(file) {
    return UrlFetchApp.fetch(`${url}DownloadFile?token=${token}&path=${path}${file}`).getBlob();
  });

  var headerSize = 44; // גודל הכותרת של קובץ WAV בבתים

  // קרא את הנתונים של הקבצים
  var combinedBytes = [], bytes;
  blobs.forEach(function(blob) {
    bytes = blob.getBytes();
      // שמור את הנתונים ללא הכותרת
      combinedBytes = combinedBytes.concat(Array.from(bytes.slice(headerSize)));
  });

  var dataSize = combinedBytes.length, dataSize36 = dataSize + 36;
  var wavTitle = [
    82, 73, 70, 70,  // 'RIFF' ב-ASCII
    dataSize36 & 0xFF, (dataSize36 >> 8) & 0xFF, (dataSize36 >> 16) & 0xFF, (dataSize36 >> 24) & 0xFF,  // גודל הקובץ - 8 בתים
    87, 65, 86, 69,  // 'WAVE' ב-ASCII
    102, 109, 116, 32,  // נתח 'fmt'
    16, 0, 0, 0,  // תת נתח 1 גודל (16 עבור PCM)
    1, 0,  // פורמט שמע (1 עבור PCM)
    1, 0,  // מספר ערוצים (1 עבור מונו, 2 עבור סטריאו)
    64, 31, 0, 0,  // קצב דגימה (8000 הרץ בפורמט ליטל-אנדיאן)
    128, 62, 0, 0,  // קצב בתים (קצב דגימה * מספר ערוצים * סיביות לדגימה / 8)
    2, 0,  // יישור בלוק (מספר ערוצים * ביטים לדגימה / 8)
    16, 0,  // סיביות לדגימה (16 סיביות)
    100, 97, 116, 97,  // נתח 'data'
    dataSize & 0xFF, (dataSize >> 8) & 0xFF, (dataSize >> 16) & 0xFF, (dataSize >> 24) & 0xFF  // גודל נתונים
  ];
  var wav = wavTitle.concat(combinedBytes);
  var combinedBlob = Utilities.newBlob(wav, 'audio/wav', 'combined.wav');
  
  return combinedBlob;
}

/**
 * מעלה קובץ לכתובת ה-URL שצוינה באמצעות בקשת HTTP POST עם נתונים מרובי חלקים/טופס.
 *
 * @param {string} path - הנתיב שבו יש להעלות את הקובץ.
 * @param {Blob} fileBlob - blob הקובץ שיש להעלות.
 */
function uploadFile(path, fileBlob) {

  var yemotUrl = url + 'UploadFile';

  var formData = {
    'upload': fileBlob,
    'token': token,
    'path': path
  };
  
  var options = {
    'method': 'post',
    'payload': formData,
    'muteHttpExceptions': true
  };
  
  var response = UrlFetchApp.fetch(yemotUrl, options);
  var responseCode = response.getResponseCode();
  Logger.log(response.getContentText());
  if (responseCode === 200) {
    return JSON.parse(response.getContentText());
  } else {
    return {'שגיאה': 'הבקשה נכשלה עם קוד תגובה ' + responseCode};
  }
}

כעת יותר מובן או יותר מסובך??....