NetSuite nlapiRunReport隐秘的API

作为中国现金流量表剖析的后续篇,今朝我们谈一个隐秘函数。在几周之前,当用户问我:“SuiteScript能调用标准财务报表的运行结果么?”。我的答案是“No!”,斩钉截铁。但是直到我们从代码堆里发现了这个API - nlapiRunReport。终于又让我们对NetSuite的理解又进了一层,再一次印证了我的认知局限,学艺不精、惭愧不已。

 

Google、GitHub了一圈,只有一篇有价值的文章,亦来自C站。

NetSuite 记录通过脚本从报表中读取数据的过程_吴铁柱儿的博客-CSDN博客

chatGPT的答案其实也是来自网络,只说了是隐藏,并且最好别用。因为会被进化掉,只是概率较小。

 基于上面提供的细节,在咨询了NetSuite开发大神后,我们渐渐扒出了这个API的全貌。

nlapiRunReport 是一个隐藏的API,遵从SuiteScript 1.0规范,其用途是对financial Report的代码调用并获取其运行结果中的数据。在2.0被进化掉了,但是由于在某些官方本土化Bundle中仍然使用,所以只能逐步Phase Out,个人判断永远不会。因为,作为一个平台产品是不能不考虑既有的用户自己做的那些客制功能的,那是客户的资产了,如果弃用这个API,影响太大。想想各类End Of Available的那些基础API,你就知道退出成本有多高了。

API定义:nlapiRunReport(reportId, reportSettings)

  • 参数reportId是财务报表的Internal ID;
  • 参数reportSettings是财务报表的搜索参数;

除了这个主体API外,还有几个附属函数。基本上可以顾名思义。

nlobjReportSettings(paramsObj.periodFrom, paramsObj.periodTo)

getColumnHierarchy()

getVisibleChildren()

getRowHierarchy()

getSummaryLine()

由于没有任何的官方文档可以参考,我们通过分析现有代码,做了Demo出来,实证有效。搞开发的同学参考之。

以下是Restlet脚本,Get Function = cn.rlv1.fin.standard.reports.run

由于环境有差异,请将Line 40处的参数调整为自己的。

        var params = {

            subsidiary: '3', // Sub 3

            fiscalCalendar:'1',//Calendar 1

            periodFrom: '258', // Feb 2023

            periodTo: '259', // Feb 2023

            };

Enjoy your coding!

/*** NetSuite知识会分享 2023-3-25* * nlapiRunReport 是一个隐藏的API,其用途是对financial Report的代码调用并获取其运行结果中的数据。* * 本脚本是个范例,指示如何使用此API。* * 场景为:调用General Ledger Report(id=293)报表的Bank Type的科目汇总金额。报表的参数包括:Sub=3,起止期间都是 258。* * Params*      subsidiary      - mandatory for One-World account, will throw error if it is One-World account and subsidiary is not given*      fiscalCalendar  - mandatory if it is One-World account and Multi-Calendar feature has been enabled*      periodFrom      - mandatory*      periodTo        - mandatory*      location        - optional*      department      - optional*      classification  - optional* * Return* String representative of below json object.* {startBalanceCurrent: 0,endBalanceCurrent: 0,}*/
if (!cn) {var cn = {};
}
cn.rlv1 = cn.rlv1 || {};
cn.rlv1.fin = cn.rlv1.fin || {};
cn.rlv1.fin.standard = cn.rlv1.fin.standard || {};
cn.rlv1.fin.standard.reports = cn.rlv1.fin.standard.reports || {};cn.rlv1.fin.standard.reports = function() {var isOW;var reportByPeriod;var generalLedgerColumnName;var unrealizedGainAndLossColumnName;this.doGet = function(params) {var params = {subsidiary: '3', // Sub 3fiscalCalendar:'1',//Calendar 1periodFrom: '258', // Feb 2023periodTo: '259', // Feb 2023};isOW = isOW();var paramsObj = validateParams(params);// check language, etcvar langPref = getUserLanguage();nlapiLogExecution('DEBUG', 'doGet', 'langPref=' + langPref);if (langPref === 'zh_CN') {generalLedgerColumnName = '\u4f59\u989d';} else {generalLedgerColumnName = 'Balance'; //Balance是general ledger report的特别列,其他报告不一定有}// Reference getPeriod comments for the structure of periodObjvar periodObj = getPeriod(paramsObj.periodFrom, paramsObj.periodTo, paramsObj.fiscalCalendar);var rtn = {startBalanceCurrent: 0,endBalanceCurrent: 0,};// Beginning balance of cash and cash equivalents - Current Periodif (periodObj.periodFrom.lastPeriod.id) {rtn.startBalanceCurrent = runGeneralLedgerReport({'subsidiary': paramsObj.subsidiary,'periodFrom': periodObj.periodFrom.lastPeriod.id,'periodTo': periodObj.periodFrom.lastPeriod.id});}// Ending balance of cash and cash equivalents - Current Periodrtn.endBalanceCurrent = runGeneralLedgerReport({'subsidiary': paramsObj.subsidiary,'periodFrom': paramsObj.periodTo,'periodTo': paramsObj.periodTo});nlapiLogExecution('AUDIT', 'doGet', 'rtn=' + JSON.stringify(rtn));return JSON.stringify(rtn);}/*** Validate passed-in parameters. Will throw exception if meets below condition:*      passed-in parameters is undefined, null or ''*      One-World account and subsidiary is undefined, null or ''*      One-World account with Multi-Calendar feature been enabled and fiscalCalendar is undefined, null or ''*      periodFrom is undefined, null or ''*      periodTo is undefined, null or ''* @return object of pass in parameters if there are no exception*/function validateParams(params) {if (!params) {throw nlapiCreateError('RunStandardReportError', 'Run report params are undefined', true);}nlapiLogExecution('AUDIT', 'validateParams', 'params=' + JSON.stringify(params));if (!isObject(params)) {var paramsObj = JSON.parse(params);} else {paramsObj = params;}// subsidiary should not be undefined/null/'' for OWif (isOW && !paramsObj.subsidiary) {throw nlapiCreateError('RunStandardReportError', 'Subsidiary is mandatory for OW account', true);}if (isOW && isMultiCalendarEnabled() && !paramsObj.fiscalCalendar) {throw nlapiCreateError('RunStandardReportError', 'fiscalCalendar is mandatory for OW account with Multi-Calendar enabled', true);}// periodFrom should not be undefined/null/''if (!paramsObj.periodFrom) {throw nlapiCreateError('RunStandardReportError', 'period from is mandatory', true);}if (!paramsObj.periodTo) {throw nlapiCreateError('RunStandardReportError', 'period to is mandatory', true);}return paramsObj;}function runGeneralLedgerReport(paramsObj) {nlapiLogExecution('AUDIT', 'runGeneralLedgerReport', 'paramsObj=' + JSON.stringify(paramsObj));return runStandardReport(293, composeGeneralLedgerReportSettings(paramsObj), generalLedgerColumnName)}function runStandardReport(reportId, reportSettings, targetColumnName) {try {setupUserPref();var pivotTable = nlapiRunReport(reportId, reportSettings);if (!pivotTable) {return 0;}//取目标列的ID,用于后面的取值var colHier = pivotTable.getColumnHierarchy();var colChildren = colHier.getVisibleChildren();var targetCol = null;for ( var colIdx in colChildren) {nlapiLogExecution('DEBUG', 'runStandardReport', 'target col label: ' + colChildren[colIdx].getLabel());if (colChildren[colIdx].getLabel() === targetColumnName) {targetCol = colChildren[colIdx];break;}}if (targetCol === null) {throw nlapiCreateError('RunStandardReportError', 'Column ' + targetColumnName + ' does not exists', true);}recoverUserPref();//取目标列的汇总行的金额var summaryRow = pivotTable.getRowHierarchy().getSummaryLine();return summaryRow !== null ? summaryRow.getValue(targetCol) : 0;} catch (ex) {nlapiLogExecution('ERROR', 'runStandardReport Error', ex);recoverUserPref();throw ex;}}function composeGeneralLedgerReportSettings(paramsObj) {var reportSettings = composeReportSettings(paramsObj);// Only show Bank types// Active Account by Type > Account TypereportSettings.addCriteria('aatype,account,saccttype,x,x', 'Bank');if (paramsObj.location) {reportSettings.addCriteria('regtx,tranline,klocation,x,alltranlineloc', paramsObj.location);}if (paramsObj.department) {reportSettings.addCriteria('regtx,tranline,kdepartment,x,alltranline29', paramsObj.department);}if (paramsObj.classification) {reportSettings.addCriteria('regtx,tranline,kclass,x,alltranline6', paramsObj.classification);}return reportSettings;}function composeReportSettings(paramsObj) {var settings = new nlobjReportSettings(paramsObj.periodFrom, paramsObj.periodTo);if (paramsObj.subsidiary) {settings.setSubsidiary(paramsObj.subsidiary);}return settings;}function setupUserPref() {var userPref = nlapiLoadConfiguration('userpreferences');this.reportByPeriod = userPref.getFieldValue('reportbyperiod');nlapiLogExecution('AUDIT', 'setupUserPref', 'reportByPeriod = ' + this.reportByPeriod);if (this.reportByPeriod !== 'FINANCIALS') {userPref.setFieldValue('reportbyperiod', 'FINANCIALS');nlapiSubmitConfiguration(userPref);}}function recoverUserPref() {if (this.reportByPeriod !== 'FINANCIALS') {var userPref = nlapiLoadConfiguration('userpreferences');userPref.setFieldValue('reportbyperiod', this.reportByPeriod);nlapiSubmitConfiguration(userPref);}}function getPeriod(periodFrom, periodTo, fiscalCalendar) {var startDateInfo = getStartDateInfo(periodFrom, periodTo);var filterExpression = [["isadjust","is","F"],"AND",["isinactive","is","F"],"AND",["isquarter","is","F"],"AND",["isyear","is","F"],"AND",[["startdate","on",startDateInfo.periodFromObj.lastPeriod],"OR",["startdate","on",startDateInfo.periodFromObj.samePeriodLastFiscalYear],"OR",["startdate","on",startDateInfo.periodFromObj.lastPeriodOneFiscalYearAgo],"OR",["startdate","on",startDateInfo.periodToObj.lastPeriod],"OR",["startdate","on",startDateInfo.periodToObj.samePeriodLastFiscalYear],"OR",["startdate","on",startDateInfo.periodToObj.lastPeriodOneFiscalYearAgo]]];if (fiscalCalendar) {filterExpression.push('AND');filterExpression.push(["fiscalcalendar","is",fiscalCalendar]);}var periodNameCol = new nlobjSearchColumn('periodname');var startDateCol = new nlobjSearchColumn('startdate');var columns = [periodNameCol,startDateCol];var searchresults = nlapiSearchRecord('accountingperiod', null, filterExpression, columns);nlapiLogExecution('DEBUG', 'getPeriod', 'searchresults = ' + JSON.stringify(searchresults));var rtn = {'periodFrom': {'lastPeriod': {'startdate': startDateInfo.periodFromObj.lastPeriod},'samePeriodLastFiscalYear': {'startdate': startDateInfo.periodFromObj.samePeriodLastFiscalYear},'lastPeriodOneFiscalYearAgo': {'startdate': startDateInfo.periodFromObj.lastPeriodOneFiscalYearAgo}},'periodTo': {'lastPeriod': {'startdate': startDateInfo.periodToObj.lastPeriod},'samePeriodLastFiscalYear': {'startdate': startDateInfo.periodToObj.samePeriodLastFiscalYear},'lastPeriodOneFiscalYearAgo': {'startdate': startDateInfo.periodToObj.lastPeriodOneFiscalYearAgo}}};for (var i = 0; searchresults != null && i < searchresults.length; i++) {var searchresult = searchresults[i];var id = searchresult.getId();var periodName = searchresult.getValue(periodNameCol);var startDate = searchresult.getValue(startDateCol);if (startDate === startDateInfo.periodFromObj.lastPeriod) {rtn.periodFrom.lastPeriod.id = id;rtn.periodFrom.lastPeriod.name = periodName} else if (startDate === startDateInfo.periodFromObj.samePeriodLastFiscalYear) {rtn.periodFrom.samePeriodLastFiscalYear.id = id;rtn.periodFrom.samePeriodLastFiscalYear.name = periodName;} else if (startDate === startDateInfo.periodFromObj.lastPeriodOneFiscalYearAgo) {rtn.periodFrom.lastPeriodOneFiscalYearAgo.id = id;rtn.periodFrom.lastPeriodOneFiscalYearAgo.name = periodName;}// periodFrom and periodTo might be the sameif (startDate === startDateInfo.periodToObj.lastPeriod) {rtn.periodTo.lastPeriod.id = id;rtn.periodTo.lastPeriod.name = periodName;} else if (startDate === startDateInfo.periodToObj.samePeriodLastFiscalYear) {rtn.periodTo.samePeriodLastFiscalYear.id = id;rtn.periodTo.samePeriodLastFiscalYear.name = periodName;} else if (startDate === startDateInfo.periodToObj.lastPeriodOneFiscalYearAgo) {rtn.periodTo.lastPeriodOneFiscalYearAgo.id = id;rtn.periodTo.lastPeriodOneFiscalYearAgo.name = periodName;}}nlapiLogExecution('AUDIT', 'getPeriod', 'periodObj = ' + JSON.stringify(rtn));return rtn;}function getStartDateInfo(periodFrom, periodTo) {var filterExpression = [["internalid","anyof",periodFrom,periodTo]];var periodNameCol = new nlobjSearchColumn('periodname');var lastPeriodCol = new nlobjSearchColumn('formuladate').setFormula("ADD_MONTHS({startdate}, -1)");var samePeriodLastFiscalYearCol = new nlobjSearchColumn('formuladate').setFormula("ADD_MONTHS({startdate}, -12)");var lastPeriodOneFiscalYearAgoCol = new nlobjSearchColumn('formuladate').setFormula("ADD_MONTHS({startdate}, -13)");var columns = [periodNameCol,lastPeriodCol,samePeriodLastFiscalYearCol,lastPeriodOneFiscalYearAgoCol];var searchresults = nlapiSearchRecord('accountingperiod', null, filterExpression, columns);for (var i = 0; searchresults != null && i < searchresults.length; i++) {var searchresult = searchresults[i];var id = searchresult.getId();if (id === periodFrom) {var fromPeriodObj = {'id': periodFrom,'name': searchresult.getValue(periodNameCol),'lastPeriod': searchresult.getValue(lastPeriodCol),'samePeriodLastFiscalYear': searchresult.getValue(samePeriodLastFiscalYearCol),'lastPeriodOneFiscalYearAgo': searchresult.getValue(lastPeriodOneFiscalYearAgoCol)};}// Return two records even when from and to are the sameif (id === periodTo) {var toPeriodObj = {'id': periodFrom,'name': searchresult.getValue(periodNameCol),'lastPeriod': searchresult.getValue(lastPeriodCol),'samePeriodLastFiscalYear': searchresult.getValue(samePeriodLastFiscalYearCol),'lastPeriodOneFiscalYearAgo': searchresult.getValue(lastPeriodOneFiscalYearAgoCol)};}}nlapiLogExecution('DEBUG', 'getStartDateInfo', 'fromPeriodObj=' + JSON.stringify(fromPeriodObj));nlapiLogExecution('DEBUG', 'getStartDateInfo', 'toPeriodObj=' + JSON.stringify(toPeriodObj));return {'periodFromObj': fromPeriodObj,'periodToObj': toPeriodObj};}/*** Get earliest period that startdate is within startdateFrom and startdateTo.*/function getEarliestPeriod(fiscalCalendar, startdateFrom, startdateTo) {nlapiLogExecution('DEBUG', 'getEarliestPeriod', 'fiscalCalendar=' + fiscalCalendar + ', startdateFrom=' + startdateFrom + ', startdateTo=' + startdateTo);var filters = getBasePeriodFilter(fiscalCalander);filters.push("AND").push(["startdate","within",startdateFrom,startdateTo]);nlapiLogExecution('DEBUG', 'getEarliestPeriod', 'filters=' + JSON.stringify(filters));var periodNameCol = new nlobjSearchColumn('periodname');var startDateCol = new nlobjSearchColumn('startdate');startDateCol.setSort(); // ascending ordervar columns = [periodNameCol,startDateCol];var searchresults = nlapiSearchRecord('accountingperiod', null, filters, columns);if (!searchresults) {throw nlapiCreateError('RunStandardReportError', 'Should have at least one period between ' + startdateFrom + " and " + startdateTo, true);}nlapiLogExecution('DEBUG', 'getEarliestPeriod', 'return=' + searchresults[0].getValue(periodNameCol));return searchresults[0].id;}function getBasePeriodFilter(fiscalCalendar) {var baseFilter = [["isadjust","is","F"],"AND",["isinactive","is","F"],"AND",["isquarter","is","F"],"AND",["isyear","is","F"]];if (fiscalCalander) {baseFilter.push("AND").push(["fiscalcalendar","anyof",fiscalCalendar]);}return baseFilter;}function getUserLanguage() {return nlapiLoadConfiguration('userpreferences').getFieldValue('language');}/*** @return true if it is One-World account.*/function isOW() {return nlapiGetContext().getFeature('SUBSIDIARIES');}/*** @return true if Multi-Calendar feature has been enabled.*/function isMultiCalendarEnabled() {return nlapiGetContext().getFeature('MULTIPLECALENDARS');}/*** @return true if Multi-Currency feature has been enabled.*/function isMultiCurrencyEnabled() {return nlapiGetContext().getFeature('MULTICURRENCY');}function isObject(bechecked) {return typeof bechecked === 'object' && bechecked.constructor === Object || Object.prototype.toString.apply(bechecked) === '[object Object]';}
};cn.rlv1.fin.standard.reports.run = function(params) {var standardReports = new cn.rlv1.fin.standard.reports();return standardReports.doGet(params);
}

如果有任何关于NetSuite的问题,欢迎来谈。我的邮箱:rick.mao@truston.group

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/30647.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

被 ChatGPT 点燃的向量数据库们

主要观点&#xff1a; 向量数据库可以让开发者以向量嵌入的形式处理非结构化数据&#xff08;两个向量之间的距离代表了它们的关联性&#xff09;&#xff0c;这对于使用和扩展大型语言模型&#xff08;LLM&#xff09;尤为重要。 1、Pinecone 是个全托管的 SaaS 向量数据库厂商…

AI批改英语作文行不行?免费,覆盖雅思考研四六级,打分评语纠错都得有 | 测评...

茕茕 发自 凹非寺量子位 报道 | 公众号 QbitAI 我&#xff0c;一个科技小编&#xff0c;最近在跟国外大佬的邮件交流中&#xff0c;感到飘过六级后的自己英语写作水平那真是日渐捉急。 从句怎么用&#xff1f;时态对不对&#xff1f;看着对面主编犀利的目光&#xff0c;那一瞬间…

如何让ChatGPT成为你最佳的模拟面试官

正在上传…重新上传取消 ChatGPT云炬学长 1 人赞同了该文章 如何让ChatGPT成为你最佳的模拟面试官随着技术的不断发展&#xff0c;越来越多的企业开始使用人工智能面试官来帮助筛选候选人&#xff0c;ChatGPT作为其中的一种代表&#xff0c;正在受到越来越多的关注。那么如何…

春种一粒粟:企业如何修炼好云原生内功?

日月盈昃&#xff0c;辰宿列张。寒来暑往&#xff0c;秋收冬藏。 《千字文》里蕴藏了一种人与天地之间共处的智慧&#xff0c;那就是想要收获粮食&#xff0c;一定要提前播种。农耕如此&#xff0c;百业如此&#xff0c;数字化创新也是一样。 数字化技术&#xff0c;已经成为全…

《云原生构建数字世界》简介

云原生是在云计算时代指导企业基于云架构设计和开发应用&#xff0c;并将应用向云端迁移的一套全新的技术理念。与传统应用相比&#xff0c;所谓的云原生应用即为云而生。构筑数字世界新未来的关键是用云原生的思维去践行&#xff0c;未来数字世界的基础就是建立在云原生之上&a…

用云原生思维践行云原生,你做对了吗?

有了ChatGPT&#xff0c;你还会再用关键字进行搜索吗?这就像企业已经上了云&#xff0c;还会再退回老路&#xff0c;自己摆弄服务器、存储吗&#xff1f;无论从技术的持续演进&#xff0c;还是从应用现代化的需求来看&#xff0c;企业上云&#xff0c;开弓没有回头箭&#xff…

字符串 - 二进制和文本字符串 - 探究

1.应用场景 主要用于探究字符串中的二进制和文本字符串&#xff0c;以及它们的区别和应用场景。 2.学习/操作 1.文档阅读 重要来自于与chatgpt的对话问答 以及其他技术文章 2.整理输出 2.1 是什么 二进制和文本字符串都是计算机中常用的数据类型&#xff0c;前者主要用于存储…

chatgpt赋能python:用Python抢优惠券,快速低价购物!

用Python抢优惠券&#xff0c;快速低价购物&#xff01; 优惠券在购物时可以给我们带来很大的优惠&#xff0c;可是抢到优惠券的几率并不是那么高。有了Python&#xff0c;我们可以编写自己的优惠券抢购程序&#xff0c;快速抢到心仪的优惠券&#xff0c;无需反复手动尝试&…

chatgpt赋能python:长截图是什么?

长截图是什么&#xff1f; 长截图是一种比较新颖的网页截图方式&#xff0c;它的特点就是可以将整个页面的内容全部截取下来&#xff0c;让用户通过滚动鼠标来浏览这个页面的所有内容。这种截图方式在移动端比较常见&#xff0c;因为移动端的屏幕较小&#xff0c;往往需要滚动…

体外诊断(POCT)之软件介绍

这是2016上半年的研究成果,其中包括了概率统计,密码学,软件逆向,图像编解码,图像识别,多媒体指令优化等多个学科知识的交叉 下面即从技术角度,对所用得到的知识开发的这个产品进行一个简易的描述说明. 扩展阅读: 体外诊断(POCT)之软件入口配置修改 体外诊断(POCT)之系统配置文…

医疗信息管理系统(HIS)——>业务介绍

目录 一、项目背景 二、业务 三、门诊流程 四、住院流程 五、页面原型初稿&#xff08;门诊&#xff09;介绍 六、 页面原型初稿&#xff08;住院&#xff09;介绍 七、页面原型初稿&#xff08;药房药库&#xff09;介绍 一、项目背景 医疗信息系统是现代化医院运营的必…

三款实用分析诊断工具简介

当处理海量数据的时候&#xff0c;很容易出现各种异常和性能瓶颈&#xff0c;这时常常需要分析程序运行行为和性能瓶颈以优化系统性能。这里简单介绍了三种强大的分析诊断工具以帮助大家更快更好的完成优化工作。 1.Arthas Arthas是 阿里巴巴开源的一款 Java 线上诊断工具&…

玩转群晖NAS——前言

一直以来就有购置一台家用服务器的想法&#xff0c;趁着双十一赶紧购置一波&#xff0c;于是就买了个群晖DS920还有4个8T的希捷酷狼Pro硬盘&#xff0c;花了我一万多的钱&#xff0c;心疼归心疼&#xff0c;东西到手之后的兴奋还是远远大于剁手之痛的。迫不及待地安装上之后&am…

怎么把群晖个人用户空间相片映射到公共空间/photo

怎么把群晖个人用户空间相片映射到公共空间/photo 1.打开File Station 到homes 目录下对应用户名右键复制用户名路径 这里复制/volume1/home/user1 2.打开控制面板进入任务计划新增触发任务事件选开机用户账户选root 任务设置用户自定义脚本填入脚本点确定回到任务。 mkdir /…

有了群晖怎么玩,分享一下我的群晖中运行的服务

原文网址&#xff1a;https://post.smzdm.com/p/a07mk7z9/ 我前几篇文章中说了我在服务器中弄了个虚拟机群晖&#xff0c;很多朋友在没有入手群晖的时候不知道群晖这玩意买来干嘛&#xff0c;花这么多钱&#xff0c;这篇文章就讲讲群晖有那些好玩实用的东西 一、Drive-套件文…

如何使用群晖nas快速收集多份文件?

经常需要在工作中收集文件的小伙伴是否遇到了一个共同的问题⚠&#xff1a; 比如老板让你收集公司员工的工作报告时&#xff0c;你一打开邮箱&#xff0c;几十封、几百封邮件就会涌进来&#xff0c;需要进行下载上百封邮件需要下载。有时候一些同事通过QQ、微信等各种app发送&a…

群晖NAS与Windows系统实现共享文件夹同步方案

一、在Windows系统中创建需要共享的文件夹 操作步骤如下&#xff1a; ①选中需要共享的文件夹&#xff0c;选择“属性”。 ②在属性弹窗中选择“共享”-->“高级共享”-->“权限”-->"添加"-->"高级"-->"立即查找"选择合适的账…

3.3 利用群晖:群辉与PC电脑直连,实现万兆/2.5G速度文件互传(解决 直连后 网络/外网/网页 访问变慢,直连后群辉无网络 cloud sync无网络)

为黑群晖和电脑装备了万兆X540 T2网卡&#xff0c;为实现万兆速度的文件互传&#xff0c;决定将黑群晖直连PC&#xff0c;其需要注意的点有以下三点&#xff1a; 修改PC和群辉的IPv4&#xff1a; 为实现固定IP访问群辉&#xff0c;这里建议修改PC和群辉均为固定IP。 1&#xff…

[NAS] Synology (群晖) DSM 7.X 挂载NTFS硬盘

前言 群晖默认支持的文件系统有btrfs和ext4,对于一些媒体影音游戏等比较大的文件,组RAID做热备对于笔者个人来说不太划算, 而在系统升级或者换设备备份时候把这些挟裹进去,备份文件则是巨大无比. 笔者的分盘策略是RAID5只存系统软件类电子书之类的软件, 挂载NTFS做云备份 冷备…

【森气杂谈】群晖NAS内外网磁盘映射以及quick connect设置

【森气杂谈】群晖NAS内外网磁盘映射以及quick connect设置 NAS内网磁盘映射具体操作步骤 NAS外网磁盘映射具体操作步骤 quick connect NAS内网磁盘映射 在频繁使用NAS时&#xff0c;网页版体验确实不是很好&#xff0c;针对这个问题&#xff0c;可以利用windows资源管理器里的…