GAS 脚本,用于从附加到传入电子邮件的 excel 文件中复制标签并将其粘贴到谷歌表格中

问题描述 投票:0回答:1

我有一个 GAS 需要:

  1. 查找带有特定标签的最新邮件
  2. 打开 attaced excel 文件并复制名为“reservations”的选项卡
  3. 将数据粘贴到谷歌表格的“mews”标签中

以下代码在第 45 行出现错误“异常:获取对象 SpreadsheetApp 上的方法或属性 openById 时出现意外错误。”

 var label = GmailApp.getUserLabelByName('sbh_channel');
  var threads = GmailApp.search("in:inbox label:sbh_channel", 0, 1);
  var message = threads[0].getMessages()[1];
   Logger.log("Message Subject: " + message.getSubject());
  
  var attachments = message.getAttachments();
  if (attachments.length > 0) {
    for (var i = 0; i < attachments.length; i++) {
      var attachment = attachments[i];
      Logger.log("Attachment Name: " + attachment.getName());
      Logger.log("Attachment Type: " + attachment.getContentType());
      Logger.log("Attachment Size: " + attachment.getSize());
    }
  } else {
    Logger.log("No attachments found.");
  }

  //Find the Excel attachment in the email
  var attachments = message.getAttachments();
  var excelFile;
  for (var i = 0; i < attachments.length; i++) {
    var attachment = attachments[i];
    if (attachment.getContentType() == MimeType.MICROSOFT_EXCEL) {
      excelFile = attachment;
      break;
    }
  }
  if (!excelFile) {
    Logger.log("No Excel attachment found in email.");
    return;
  }
  Logger.log("Excel attachment found.");

  //Get the spreadsheet ID from the attachment file name
  var spreadsheetId = excelFile.getName().match(/[-\w]{25,}/);
  if (!spreadsheetId) {
    Logger.log("Could not extract spreadsheet ID from attachment file name.");
    return;
  }
  spreadsheetId = spreadsheetId[0];
  Logger.log("Spreadsheet ID: " + spreadsheetId);

  //Open the Excel file and get the data from the "Reservations" tab
  var spreadsheet = SpreadsheetApp.openById(spreadsheetId)[0];
  var sheet = spreadsheet.getSheetByName("Reservations");
  var data = sheet.getDataRange().getValues();
  Logger.log("Data loaded from Excel file.");

  //Open the Mews Google Sheets file and paste the data into the "Mews" sheet
  var ss = SpreadsheetApp.openById("1DLCn9mwhwlKD6eCDGWVA119X_CL-zPOnQbPk_ncaDtE");
  var sheetName = ss.getSheetByName("Mews");
  sheetName.getRange(2, 3, data.length, data[0].length).setValues(data);
  Logger.log("Data pasted to Mews sheet.");
}
google-apps-script
1个回答
0
投票

关于

var spreadsheetId = excelFile.getName().match(/[-\w]{25,}/);
Get the spreadsheet ID from the attachment file name
在你的脚本中,在你的情况下,我担心如果电子表格ID无效,会发生这样的错误。

如果您想从附件文件的 XLSX 数据中检索值,我认为此线程中的此方法 可能会有用。当这个方法体现在你的脚本中,下面的修改怎么样?

用法:

1。安装 SheetJS 库。

请从https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js复制SheetJS库的脚本,粘贴到Google Spreadsheet的脚本编辑器,并保存脚本。

在这种情况下,我想推荐以下流程。

  1. 向脚本编辑器添加一个新脚本。例如,文件名为
    SheetJS
    .
  2. https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js的脚本复制粘贴到添加的脚本文件中,并保存脚本。

2。修改脚本:

安装库后,请按如下方式修改显示脚本。

来自:

//Get the spreadsheet ID from the attachment file name
var spreadsheetId = excelFile.getName().match(/[-\w]{25,}/);
if (!spreadsheetId) {
  Logger.log("Could not extract spreadsheet ID from attachment file name.");
  return;
}
spreadsheetId = spreadsheetId[0];
Logger.log("Spreadsheet ID: " + spreadsheetId);

//Open the Excel file and get the data from the "Reservations" tab
var spreadsheet = SpreadsheetApp.openById(spreadsheetId)[0];
var sheet = spreadsheet.getSheetByName("Reservations");
var data = sheet.getDataRange().getValues();
Logger.log("Data loaded from Excel file.");

致:

var book = XLSX.read(new Uint8Array(attachment.getBytes()), { type: "array" });
var csv = XLSX.utils.sheet_to_csv(book.Sheets["Reservations"]);
var data = Utilities.parseCsv(csv);
if (data.length == 0) return;
  • 运行此修改后的脚本时,将从附件文件的 XLSX 数据中的“预订”中检索值,并使用脚本将检索到的值放入电子表格中。

注:

  • 在这个脚本中,如果不想把SheetJS库复制粘贴到脚本编辑器中,也可以用下面的脚本安装。但是,在这种情况下,工艺成本变高。请注意这一点。

    const cdnjs = "https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js";
    eval(UrlFetchApp.fetch(cdnjs).getContentText());
    

参考:

© www.soinside.com 2019 - 2024. All rights reserved.