Python调用Google Apps Script:实现无缝自动化认证的教程

Python调用Google Apps Script:实现无缝自动化认证的教程

在Python中调用Google Apps Script API进行自动化操作时,重复的身份验证是常见障碍。本文将详细介绍如何通过管理和重用认证凭据(使用token.%ignore_a_1%文件),实现无缝、无需人工干预的认证流程。通过此方法,开发者可以构建稳定的自动化脚本,避免手动授权,从而支持端到端自动化部署,提高工作效率。

理解自动化认证挑战

当python脚本需要与google服务(如google sheets、google drive或google apps script)交互时,通常会采用oauth 2.0协议进行身份验证。这个过程通常涉及用户在浏览器中登录google账户,并授权应用程序访问其google数据。对于一次性或交互式任务而言,这种方式是可行的。

然而,在需要端到端自动化(例如定时任务、后台服务或无头服务器上的脚本)的场景中,重复的用户交互式认证会成为一个严重障碍。每次运行脚本都要求手动登录和授权,这完全违背了自动化的初衷。核心挑战在于如何让脚本在没有人工干预的情况下,安全地获取并维持对Google服务的访问权限。

核心概念与准备工作

要实现Python脚本对Google Apps Script的无缝自动化调用,我们需要理解并准备以下关键组件:

Google Cloud 项目与API启用:确保你有一个Google Cloud项目。在该项目中,启用“Google Apps Script API”。这是Python脚本调用Apps Script的基础。OAuth 2.0 客户端凭据 (credentials.json):在Google Cloud Console中,为你的项目创建一个OAuth 2.0客户端ID(通常选择“桌面应用”类型)。下载生成的JSON文件,并将其命名为credentials.json,放置在Python脚本的同一目录下。此文件包含客户端ID和客户端密钥,用于首次启动认证流程。授权范围 (Scopes):Scopes定义了你的应用程序可以访问的Google服务和数据类型。选择最小必要的权限至关重要,以降低安全风险。例如,如果你的Apps Script只操作Google Sheets,则只需要https://www.googleapis.com/auth/spreadsheets。在本文的示例中,为了演示更广泛的集成能力,我们使用了一组相对全面的Scopes,但在实际生产环境中应严格限制。令牌文件 (token.json):这是实现自动化认证的核心。首次成功授权后,Google会返回一个访问令牌(access token)和一个刷新令牌(refresh token)。访问令牌用于短期内直接访问API,而刷新令牌则用于在访问令牌过期后,无需用户再次授权即可获取新的访问令牌。token.json文件将持久化存储这些令牌,允许脚本在后续运行时直接加载并使用它们,从而跳过交互式认证。

实现无缝认证的Python代码

以下Python代码演示了如何利用token.json文件实现Google Apps Script的自动化认证和调用。该方案的核心逻辑是:检查是否存在有效的token.json;如果存在,则加载并尝试刷新;如果不存在或无效,则启动新的认证流程并保存结果。

import os.pathfrom google.auth.transport.requests import Requestfrom google.oauth2.credentials import Credentialsfrom google_auth_oauthlib.flow import InstalledAppFlowfrom googleapiclient import errorsfrom googleapiclient.discovery import build# 定义所需的API范围。建议仅使用脚本所需的最小范围。# 以下范围列表涵盖了广泛的Apps Script和Drive操作,请根据实际需求进行调整。SCOPES = [    "https://www.googleapis.com/auth/script.projects",    "https://www.googleapis.com/auth/script.external_request",    "https://www.googleapis.com/auth/drive.readonly",    "https://www.googleapis.com/auth/drive",    "https://www.googleapis.com/auth/drive.scripts",    "https://www.googleapis.com/auth/script.processes",    "https://www.googleapis.com/auth/spreadsheets",    "https://www.googleapis.com/auth/script.scriptapp",]def run_apps_script_with_auth(script_deployment_id: str, function_name: str):    """    使用持久化认证凭据调用Google Apps Script API。    Args:        script_deployment_id (str): Google Apps Script的部署ID(不是项目ID)。        function_name (str): 要执行的Apps Script函数名称。    """    creds = None    # 1. 检查是否存在token.json文件。如果存在,尝试加载凭据。    # token.json存储了用户的访问和刷新令牌,在首次授权流程完成后自动创建。    if os.path.exists("token.json"):        creds = Credentials.from_authorized_user_file("token.json", SCOPES)    # 2. 如果没有有效的凭据,或者凭据已过期且有刷新令牌,则刷新凭据。    # 否则,启动新的认证流程。    if not creds or not creds.valid:        if creds and creds.expired and creds.refresh_token:            # 凭据过期但有刷新令牌,使用刷新令牌获取新的访问令牌            print("凭据已过期,正在尝试刷新令牌...")            creds.refresh(Request())        else:            # 没有有效的凭据,或者刷新令牌也无效/不存在,启动新的认证流程。            # 这会打开浏览器窗口,要求用户进行交互式授权。            print("未找到有效凭据或凭据无效,正在启动新的认证流程...")            flow = InstalledAppFlow.from_client_secrets_file(                "credentials.json", SCOPES            )            creds = flow.run_local_server(port=0) # port=0 会自动选择一个可用端口        # 3. 将新获得的或刷新的凭据保存到token.json文件中,以便下次运行使用。        with open("token.json", "w") as token:            token.write(creds.to_json())        print("凭据已保存到 token.json。")    try:        # 4. 使用获得的凭据构建Google Apps Script API服务客户端。        service = build("script", "v1", credentials=creds)        # 5. 创建一个执行请求对象,指定要运行的Apps Script函数。        request_body = {"function": function_name}        # 6. 调用Apps Script API执行指定的函数。        print(f"正在执行Apps Script: {function_name} (部署ID: {script_deployment_id})...")        response = service.scripts().run(body=request_body, scriptId=script_deployment_id).execute()        # 7. 处理API响应。        if 'error' in response:            # Apps Script执行失败,打印错误详情。            error_details = response['error']['details']            print(f"Apps Script执行失败。错误详情: {error_details}")            # 可以根据需要解析更具体的错误信息,例如堆栈跟踪。        else:            # Apps Script执行成功,打印结果。            print(f"Apps Script执行成功。结果: {response.get('response', {}).get('result')}")    except errors.HttpError as error:        # 捕获并打印Google API调用过程中发生的HTTP错误。        print(f"Google API调用失败: {error.content}")    except Exception as e:        # 捕获其他潜在的运行时错误。        print(f"发生未知错误: {e}")# 示例用法if __name__ == "__main__":    # 替换为你的Google Apps Script部署ID和要执行的函数名。    # 部署ID可以在Apps Script编辑器中,“部署”->“管理部署”中找到。    my_script_deployment_id = "YOUR_APPS_SCRIPT_DEPLOYMENT_ID" # 例如:AKfycbxtDnDYa2mTZKB6WoqK_D9PDsLZyqb7GQAh7pvER-K-rMFXYNa6oVOhzXHsyfyl8vLz    my_function_name = "helloWorld" # 你的Apps Script项目中定义的函数名    # 首次运行时会打开浏览器进行授权,之后会复用token.json,实现自动化。    run_apps_script_with_auth(my_script_deployment_id, my_function_name)

如何获取 script_deployment_id:在Google Apps Script编辑器中,点击“部署”->“新建部署”。选择“API可执行文件”类型。部署成功后,会生成一个“部署ID”,这就是你需要填入 my_script_deployment_id 的值。请注意,这不是Apps Script项目的ID,而是特定部署的ID。

注意事项与最佳实践

在实现自动化认证时,务必考虑以下几点以确保安全性、稳定性和可维护性:

立即学习“Python免费学习笔记(深入)”;

最小权限原则 (Least Privilege Principle):仔细审查并仅选择你的Apps Script实际运行所需的最小SCOPES。例如,如果你的脚本只读取Google Sheets数据,则不需要https://www.googleapis.com/auth/drive的写入权限。过度授权会增加潜在的安全风险。凭据文件的安全管理:credentials.json和token.json文件包含敏感的认证信息。绝不能将它们提交到公共版本控制系统(如GitHub)。在生产环境中,应采用更安全的凭据管理方式,例如:使用环境变量存储客户端ID和密钥。利用云服务提供商的密钥管理服务(如Google Secret Manager)。确保运行脚本的环境具有适当的文件系统权限,以保护这些文件。刷新令牌的生命周期:虽然刷新令牌通常具有较长的生命周期(通常是永久的,直到用户撤销授权或Google Cloud项目被删除),但并非绝对永久。在极少数情况下,刷新令牌也可能失效,此时需要重新进行一次完整的用户交互式授权流程。错误处理与日志记录:示例代码包含了基本的try-except块来捕获googleapiclient.errors.HttpError和其他通用异常。在实际应用中,应根据业务逻辑进行更细致的错误处理,例如记录详细的错误日志、发送通知或实现重试机制。解析API响应中的error字段,可以获取Apps Script内部执行失败的具体信息,这对于调试至关重要。无头(Headless)环境部署:在没有图形界面(如服务器、Docker容器、CI/CD流水线)的环境中,flow.run_local_server(port=0)这种交互式授权方式将无法工作。对于这类环境,你需要预先在一个有界面的机器上运行一次脚本,生成token.json文件,然后将该文件安全地部署到无头环境中。或者,考虑使用服务账户(Service Account)进行认证,但服务账户对Apps Script的调用方式有所不同,通常用于直接操作Google Workspace服务,而不是通过API执行用户部署的Apps Script。

总结

通过采用持久化的认证令牌(token.json),Python脚本可以有效地绕过Google Apps Script API调用的重复认证问题,实现真正的自动化。这种方法允许开发者构建健壮、无需人工干预的自动化流程,极大地提升了集成效率和可靠性。遵循最小权限原则和严格的安全实践,是确保自动化系统安全运行的关键。

以上就是Python调用Google Apps Script:实现无缝自动化认证的教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1370849.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Python怎么创建虚拟环境_Python虚拟环境创建与管理教程
上一篇 2025年12月14日 10:54:35
Python怎么生成一个随机数_Python随机数生成技巧
下一篇 2025年12月14日 10:54:51

相关推荐

  • 格子达论文查重怎么操作_格子达官方检测系统指南

    格子达论文查重怎么操作_格子达官方检测系统指南格子达论文查重怎么操作_格子达官方检测系统指南格子达论文查重怎么操作_格子达官方检测系统指南格子达论文查重怎么操作_格子达官方检测系统指南

    首先登录格子达官网注册账号并登录,接着在个人中心上传符合格式的论文文件,填写必要信息后提交检测,最后等待系统生成报告并下载查看总相似比、AI占比等数据,结合标注内容进行修改。 格子达论文查重怎么操作?这是不少网友都关注的,接下来由PHP小编为大家带来格子达官方检测系统指南,感兴趣的网友一起随小编来瞧…

    2026年9月28日 • 用户投稿
    000
  • Android 应用中页面(Activity)间导航的实现指南

    Android 应用中页面(Activity)间导航的实现指南Android 应用中页面(Activity)间导航的实现指南Android 应用中页面(Activity)间导航的实现指南Android 应用中页面(Activity)间导航的实现指南

    本文详细介绍了在 Android 应用中如何通过按钮实现不同页面(Activity)之间的切换。核心机制是使用 Intent 对象来指定目标 Activity,并通过 startActivity() 方法启动它。文章提供了 MainActivity.java 中的示例代码,并强调了 AndroidM…

    2026年9月28日 • 用户投稿
    000
  • sublime怎么在替换时使用换行符_Sublime查找替换功能中使用换行符

    sublime怎么在替换时使用换行符_Sublime查找替换功能中使用换行符sublime怎么在替换时使用换行符_Sublime查找替换功能中使用换行符sublime怎么在替换时使用换行符_Sublime查找替换功能中使用换行符sublime怎么在替换时使用换行符_Sublime查找替换功能中使用换行符

    在Sublime Text中替换换行需启用正则模式,用n或R表示换行符。开启”.*”按钮后,查找用n、rn或R匹配不同换行格式,替换时用n插入换行,如将逗号替换为n可实现分行效果。 在Sublime Text中进行查找替换时,如果需要使用换行符,可以通过正则表达式模式来实现。…

    2026年9月28日 • 用户投稿
    100
  • 运维新概念:高效积累之道

    运维新概念:高效积累之道运维新概念:高效积累之道运维新概念:高效积累之道运维新概念:高效积累之道

    当前技术更新日新月异,各类语言、工具和理念层出不穷,令人应接不暇。唯有持续学习、不断吸收新知,方能紧跟发展潮流,不被时代淘汰。 1、 IT部门面临诸多挑战 2、 目前,IT部门整体尚未获得充分认可。尽管信息化在各单位日益重要,仍有部分管理者将其视为单纯的成本支出部门,认为其只消耗资源而无法直接创收,…

    2026年9月28日 • 用户投稿
    100
  • 如何下载豆包AI应用 豆包AI应用下载与安装步骤解析

    如何下载豆包AI应用 豆包AI应用下载与安装步骤解析如何下载豆包AI应用 豆包AI应用下载与安装步骤解析如何下载豆包AI应用 豆包AI应用下载与安装步骤解析如何下载豆包AI应用 豆包AI应用下载与安装步骤解析

    豆包ai应用下载安装方法有三种: 一、手机应用商店搜索“豆包”或“Doubao”,确认开发者为“北京字节跳动科技有限公司”后点击安装; 二、直接使用“豆包AI网页版在线使用入口☜☜☜☜直接进入”; 三、注意常见问题如无法找到应用时检查关键词、安装失败时查看存储和系统版本、iOS用户提示“未受信任的企…

    2026年9月28日 • 用户投稿
    000
  • sublime prettier插件配置_Prettier代码格式化插件配置指南

    sublime prettier插件配置_Prettier代码格式化插件配置指南sublime prettier插件配置_Prettier代码格式化插件配置指南sublime prettier插件配置_Prettier代码格式化插件配置指南sublime prettier插件配置_Prettier代码格式化插件配置指南

    首先安装JsPrettier插件并配置prettier_cli_path和node_path路径,设置format_on_save_enabled为true以实现保存时自动格式化,确保prettier_options与项目规则一致,推荐在项目中本地安装Prettier并通过快捷键Ctrl+Alt+F…

    2026年9月28日 • 用户投稿
    000
  • 玩家请愿《往日不再2》签名近24万 索尼续作决策引争议!

    玩家请愿《往日不再2》签名近24万 索尼续作决策引争议!玩家请愿《往日不再2》签名近24万 索尼续作决策引争议!玩家请愿《往日不再2》签名近24万 索尼续作决策引争议!玩家请愿《往日不再2》签名近24万 索尼续作决策引争议!

    《往日不再》被广泛视为索尼旗下最具潜力却遭冷遇的ip之一,近期因续作迟迟未现再度引发玩家热议。这款原本规划为三部曲的开放世界游戏,因索尼对项目缺乏支持而止步于首作,甚至连开发团队bend studio都因顾虑被拒,未曾正式提交续作提案。 与此同时,Bend Studio曾被指派开发一款实时服务型游戏…

    2026年9月28日 • 用户投稿
    000
  • 将PostgreSQL存储过程转换为Spring Boot原生查询的实践指南

    将PostgreSQL存储过程转换为Spring Boot原生查询的实践指南将PostgreSQL存储过程转换为Spring Boot原生查询的实践指南将PostgreSQL存储过程转换为Spring Boot原生查询的实践指南将PostgreSQL存储过程转换为Spring Boot原生查询的实践指南

    本文旨在指导开发者如何将PostgreSQL存储过程转换为Spring Boot应用中的原生SQL查询。通过分析一个具体的存储过程,我们将详细演示如何构建等效的SQL查询,并介绍Spring Data JPA @Query注解中两种主要的参数映射方式:命名参数和位置参数,以实现存储过程的替代。 存储…

    2026年9月28日 • 用户投稿
    100
  • 没有体力限制 没有抽卡的二游!《二重螺旋》10月28日公测

    没有体力限制 没有抽卡的二游!《二重螺旋》10月28日公测没有体力限制 没有抽卡的二游!《二重螺旋》10月28日公测没有体力限制 没有抽卡的二游!《二重螺旋》10月28日公测没有体力限制 没有抽卡的二游!《二重螺旋》10月28日公测

    英雄游戏旗下潘神工作室于8月26日发布消息,其自主研发的免费arpg《二重螺旋》将于10月28日正式上线,登陆pc(epic games商店)、ios及android三大平台。游戏将取消角色与武器的抽卡机制,并彻底移除体力系统。 本作构建在一个魔法与机械交融的世界观中,人类与亚人种共同生活,但拥有双…

    2026年9月28日 • 用户投稿
    000
  • 显示器HDR效果的真实表现取决于哪些关键因素?

    HDR效果的好坏取决于峰值亮度、局部调光、色域覆盖和色彩深度的协同作用,其中局部调光与峰值亮度同等重要,能显著提升对比度和画面层次,而HDR400因亮度不足且常缺乏局部调光,实际体验有限,建议选择DisplayHDR 600及以上标准,并确保内容源、连接接口(如HDMI 2.0或DP 1.4)及系统…

    2026年9月28日
    000
  • MySQL怎样使用索引合并优化 复合索引与索引合并策略

    MySQL怎样使用索引合并优化 复合索引与索引合并策略MySQL怎样使用索引合并优化 复合索引与索引合并策略MySQL怎样使用索引合并优化 复合索引与索引合并策略MySQL怎样使用索引合并优化 复合索引与索引合并策略

    索引合并是mysql中一种优化策略,允许在单个查询中使用多个索引来定位数据。其主要类型包括:1. union合并,用于or连接的条件;2. intersection合并,用于and连接的条件;3. sort-union合并,用于需排序后再合并的情况。复合索引与索引合并不同,前者是多列组合索引,后者则…

    2026年9月28日 • 用户投稿
    000
  • 深入理解Java泛型:类型参数与方法重载的实践指南

    深入理解Java泛型:类型参数与方法重载的实践指南深入理解Java泛型:类型参数与方法重载的实践指南深入理解Java泛型:类型参数与方法重载的实践指南深入理解Java泛型:类型参数与方法重载的实践指南

    本文深入探讨了Java泛型中关于类型参数与泛型类实例在方法签名中的区别,以及由此引发的类型不匹配问题。通过一个具体的代码示例,详细解析了为何在泛型方法中,直接传入泛型类实例或其内部类型参数会引发编译错误,并提供了利用方法重载这一核心机制来优雅地解决此类问题的专业指导和示例代码,帮助开发者清晰理解“h…

    2026年9月28日 • 用户投稿
    100
  • 抖音私信怎么屏蔽?抖音私信怎么屏蔽一个人的消息

    抖音私信怎么屏蔽?抖音私信怎么屏蔽一个人的消息抖音私信怎么屏蔽?抖音私信怎么屏蔽一个人的消息抖音私信怎么屏蔽?抖音私信怎么屏蔽一个人的消息抖音私信怎么屏蔽?抖音私信怎么屏蔽一个人的消息

    随着抖音的普及,越来越多用户加入这个短视频社交平台。在日常使用中,不少人会收到陌生或不想要的私信,甚至遭遇骚扰信息。为了更好地保护个人隐私和使用体验,掌握屏蔽私信的方法显得尤为重要。接下来,就为大家详细介绍如何有效屏蔽抖音私信。 一、屏蔽抖音私信的具体操作 1. 屏蔽某个特定用户 当你希望阻止某位用…

    2026年9月28日 • 用户投稿
    000
  • 如何用豆包AI写协程代码 协程代码的AI编写技巧大公开

    如何用豆包AI写协程代码 协程代码的AI编写技巧大公开如何用豆包AI写协程代码 协程代码的AI编写技巧大公开如何用豆包AI写协程代码 协程代码的AI编写技巧大公开如何用豆包AI写协程代码 协程代码的AI编写技巧大公开

    用豆包ai写协程代码的关键在于提问方式与后续优化。一、明确所需协程类型,如并发下载或任务管理,提问越具体生成代码越实用;二、注意避免阻塞调用,如将time.sleep改为await asyncio.sleep;三、善用提示词提升代码质量,如指定库、并发数及异常处理;四、结合项目结构调整代码,适配模块…

    2026年9月28日 • 用户投稿
    200
  • sublime怎么显示空格和制表符_Sublime Text显示所有空白字符设置

    sublime怎么显示空格和制表符_Sublime Text显示所有空白字符设置sublime怎么显示空格和制表符_Sublime Text显示所有空白字符设置sublime怎么显示空格和制表符_Sublime Text显示所有空白字符设置sublime怎么显示空格和制表符_Sublime Text显示所有空白字符设置

    开启Sublime Text的“draw_white_space”: “all”设置可显示空格为·、制表符为→,便于检查缩进和空白字符,提升代码规范性。 在Sublime Text中显示空格和制表符,可以帮助你更清楚地查看代码中的空白字符,提升代码整洁度和可读性。要开启显示所…

    2026年9月28日 • 用户投稿
    000
  • 洗碗机普及迎来攻坚战,行业探寻市场爆发“黄金拐点”

    洗碗机普及迎来攻坚战,行业探寻市场爆发“黄金拐点”洗碗机普及迎来攻坚战,行业探寻市场爆发“黄金拐点”洗碗机普及迎来攻坚战,行业探寻市场爆发“黄金拐点”洗碗机普及迎来攻坚战,行业探寻市场爆发“黄金拐点”

    家电行业中,谁是最被看好的“潜力股”之一?洗碗机当之不让。但是现实困境却是,洗碗机渗透率徘徊在4%左右迟迟难以突破,原因何在,又该如何破局? 2025年9月17日,由中国家电网主办的“碗美无菌国补焕新2025中国洗碗机行业高峰论坛”在千年瓷都景德镇拉开帷幕,来自A.O.史密斯、卡萨帝、finish亮…

    2026年9月28日 • 用户投稿
    100
  • 如何用豆包AI生成Python环境配置代码

    如何用豆包AI生成Python环境配置代码如何用豆包AI生成Python环境配置代码如何用豆包AI生成Python环境配置代码如何用豆包AI生成Python环境配置代码

    豆包ai可辅助生成python环境配置代码。1. 首先明确项目需求,如python版本、依赖库和虚拟环境类型;2. 向豆包ai输入具体提示词,获取创建venv和requirements.txt的命令;3. 如需复杂配置,可要求生成开发与生产环境分离的依赖文件;4. 注意版本控制、输出验证及通过多轮交…

    2026年9月28日 • 用户投稿
    100
  • 视频号私信如何改成个人私信?视频号怎么私信给作者

    视频号私信如何改成个人私信?视频号怎么私信给作者视频号私信如何改成个人私信?视频号怎么私信给作者视频号私信如何改成个人私信?视频号怎么私信给作者视频号私信如何改成个人私信?视频号怎么私信给作者

    在这个信息爆炸的时代,我们每个人都希望能拥有一个属于自己的小天地,与他人分享喜怒哀乐,同时保护自己的隐私。而微信视频号私信功能的出现,无疑为我们提供了一个绝佳的沟通平台。但是,有些朋友可能发现,自己无法将视频号私信改成个人私信。别担心,今天就来教大家如何轻松切换隐私模式,让你的沟通更加私密和安全。 …

    2026年9月28日 • 用户投稿
    100
  • JPype集成Aspose.Cells:解决Java堆内存溢出错误指南

    JPype集成Aspose.Cells:解决Java堆内存溢出错误指南JPype集成Aspose.Cells:解决Java堆内存溢出错误指南JPype集成Aspose.Cells:解决Java堆内存溢出错误指南JPype集成Aspose.Cells:解决Java堆内存溢出错误指南

    当Python程序通过JPype调用Java库(如Aspose.Cells)处理大型文件时,可能遭遇java.lang.OutOfMemoryError: Java heap space。本文将详细指导如何通过在jpype.startJVM()中配置JVM的最大堆内存参数来有效解决此类问题,确保Py…

    2026年9月28日 • 用户投稿
    200
  • sublime怎么快速注释和取消注释代码_Sublime代码块注释与取消注释的快捷操作

    sublime怎么快速注释和取消注释代码_Sublime代码块注释与取消注释的快捷操作sublime怎么快速注释和取消注释代码_Sublime代码块注释与取消注释的快捷操作sublime怎么快速注释和取消注释代码_Sublime代码块注释与取消注释的快捷操作sublime怎么快速注释和取消注释代码_Sublime代码块注释与取消注释的快捷操作

    Sublime Text中行注释快捷键为Ctrl + /(Windows/Linux)或Cmd + /(macOS),用于单行或多行代码的快速注释与取消;块注释快捷键为Ctrl + Shift + / 或Cmd + Shift + /,可将选中代码块用语言特定符号包裹。 在Sublime Text中…

    2026年9月28日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信