WPS AirScript脚本合集(十九):调用脚本获取图片URL自动生成图片写入“图片与附件”字段

一、多维表格数据表及字段结构

1、数据表名:URL生成图

2、视图名称:表格视图

3、字段设置:

  • 字段名称:URL地址 - 字段类型:文本 - 禁止录入重复值:否 - 默认值:无

  • 字段名称:附件名称 - 字段类型:文本 - 禁止录入重复值:否 - 默认值:无

  • 字段名称:图片和附件 - 字段类型:图片和附件 -显示样式:以列表样式显示 - 图片上传方式:无需勾选 仅可通过移动端拍摄上传

  • 字段名称:脚本执行情况 - 字段类型:文本 - 禁止录入重复值:否 - 默认值:无

  • 字段名称:强制刷新按钮 - 字段类型:按钮 - 执行操作:点击按钮时,触发执行AirScript脚本 - 执行成功的提示:( ´▽` )ノ刷新成功 - 按钮名称:点击按钮强制刷新 - 按钮颜色:绿色

二、开发指南相关字段说明

WPS开放平台开发指南https://open.wps.cn/documents/app-integration-dev/guide/self-app/summary.html有相关字段说明,感兴趣的小伙伴可以自行前往研究学习下~

此外,需要先在脚本编辑器对应的脚本内添加网络API哦

三、AirScript脚本说明

const recordid = Context.argv.recordid || Application.Selection.GetSelectionRecordIds()[0][0];
console.log("当前记录ID:", recordid);

// 读取字段值
let urlValue = Application.Sheets("URL生成图").Views("表格视图").RecordRange(recordid, "@URL地址").Value;
let fileName = Application.Sheets("URL生成图").Views("表格视图").RecordRange(recordid, "@附件名称").Value;
console.log("URL地址:", urlValue);
console.log("附件名称:", fileName);

// 下载链接数据并转换为Base64编码的函数
function downloadImageAndConvertToBase64(imageUrl) {
  try {
    console.log("开始下载链接数据:", imageUrl);
    
    // 使用HTTP.get方法下载链接数据
    const response = HTTP.get(imageUrl, {
      timeout: 10000  // 设置10秒超时
    });
    
    console.log("链接数据下载响应状态:", response.status);
    
    // 检查请求是否成功
    if (response.status === 200) {
      console.log("数据下载成功");
      
      // 获取图片的MIME类型
      let mimeType = "image/jpeg"; // 默认类型
      if (imageUrl.includes('.png')) {
        mimeType = "image/png";
      } else if (imageUrl.includes('.gif')) {
        mimeType = "image/gif";
      } else if (imageUrl.includes('.bmp')) {
        mimeType = "image/bmp";
      } else if (imageUrl.includes('.webp')) {
        mimeType = "image/webp";
      } else if (imageUrl.includes('.svg')) {
        mimeType = "image/svg+xml";
      }
      
      // 将链接数据转换为Base64编码
      const base64Data = `data:${mimeType};base64,${response.binary().toString('base64')}`;
      console.log("链接数据成功转换为Base64编码");
      
      return base64Data;
    } else {
      throw new Error(`HTTP请求失败,状态码: ${response.status}`);
    }
  } catch (error) {
    console.error("链接数据下载或转换失败:", error.message);
    throw error;
  }
}

// 主处理函数
function processAttachment() {
  let attachmentData; //在此统一声明变量

  try {  
      // 判断链接类型:WPS云文档链接还是普通图片链接
      const isWpsCloudLink = /^https?:\/\/www\.kdocs\.cn\/l\//.test(urlValue);
      
      if (isWpsCloudLink) {
        console.log("检测到WPS云文档链接,直接设置附件");
        
        // 如果是WPS云文档链接,直接使用URL设置附件       
        attachmentData = [{
          fileData: urlValue,
          fileName: fileName
        }];
      } else {
        console.log("检测链接,开始下载并转换为Base64");
        
        // 默认是普通图片链接,下载并转换为Base64
        const base64ImageData = downloadImageAndConvertToBase64(urlValue);
        
        // 确保文件名有正确的扩展名
        if (fileName && !fileName.includes('.')) {
          if (urlValue.includes('.png')) {
            fileName += '.png';
          } else if (urlValue.includes('.gif')) {
            fileName += '.gif';
          } else if (urlValue.includes('.bmp')) {
            fileName += '.bmp';
          } else if (urlValue.includes('.webp')) {
            fileName += '.webp';
          } else if (urlValue.includes('.svg')) {
            fileName += '.svg';
          } else {
            fileName += '.jpg'; // 默认
          }
        }
        
        attachmentData = [{
          fileData: base64ImageData,
          fileName: fileName
        }];
      }
      
      // 设置附件 - 添加错误处理
      try {
        Application.Sheets("URL生成图").RecordRange(recordid, "@图片和附件").Value = DBCellValue(attachmentData);
        console.log("附件设置成功!");
        return {
          message: "附件设置成功!",
          type: isWpsCloudLink ? "云文档链接" : "Base64图片"
        };
      } catch (setError) {
        // 专门捕获设置附件时的错误
        console.error("设置附件时发生错误:", setError);
        throw new Error(`附件设置失败: ${setError.message},请检测URL链接是否为有效的云文档或图片链接`);
      }

  } catch (error) {
    console.error("处理过程中发生错误:", error);
    
    // 清空附件
    Application.Sheets("URL生成图").RecordRange(recordid, "@图片和附件").Value = null;
    
    return {
      message: `处理失败: ${error.message},请检测URL链接是否为有效的云文档或图片链接`,
      error: true
    };
  }
}

// 执行主处理函数
return processAttachment();

先上个正常的图片链接,可以使用浏览器打开检测是否为图片,如https://mmbiz.qpic.cn/mmbiz_png/TljaIwvLPfImoGibxWn0DBnfiaRsDPuYGApSmkZFibBaibyTianEuHibwHWeqZNUPVFMXZatrx2cTgh8MMBf4vvTBjfw/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1#imgIndex=5

WPS脚本编辑器控制台运行脚本执行结果如下,说明是可以成功获取图片数据的(^o^)

再来个反面案例,如链接填个obsidian的官网地址,如https://obsidian.md/,这可是妥妥的网页链接而不是图片链接哇(´Д` )

WPS脚本编辑器控制台运行脚本执行结果如下,没错!直接报错执行失败(是的,就是这么任性σ(^_^;)

四、自动化流程设置

4.1 新增或修改记录时自动生成

4.2 点击按钮强制刷新生成

五、自动化流程运行输出示例

场景一:共享文档链接+自动生成

场景二:可公开访问的图片链接+自动生成

场景三:非图片链接

场景四:URL非云文档链接或图片链接

广东省
浏览 314
3
6
分享
6 +1
7
3 +1
全部评论 7
 
企业用户_625193381
哥,我将本地文件转为base64数据,为什么无法上传附件呀,一直提示
· 浙江省
回复
bokuto
base64数据是二进制数据,又不是图片,当然会报错呀
· 广东省
回复
 
欲水
之前附件下载链接怎么获取不到了
· 四川省
回复
bokuto
之前的帖子没删都在的哦,可以主页或公众号找找有没有你想要的
· 广东省
回复
 
λ公式探索者
点赞技术贴
· 广西
回复
bokuto
· 广东省
回复