在 Ragic 中如果有自行制作的薪资单,可以利用程序帮助你获取“费用报支”(可于应用商店 > “行政”安装)内的员工代垫款。
请先确保有“薪资单”跟“费用报支”两张表单,再透过此功能在“薪资单”点选单击钮去找“费用报支”表单里该月份该员工代垫且公司已付还(所以才会出现于“薪资单”中)的款项,程序识别的依据为对应两张表单的员工 Email,找到与“薪资单”相同月份的代垫款项,将这些已付还的代垫款相加总,并生成费用于薪资单中。
举个例子来说,如果员工小明本月有:
1. 出国出差,花机票钱来回共 6 万
2. 影印店打印文档,花 350 块
3. 邮寄,花 25 块
他在“费用报支”表单就会有三笔数据,三笔数据的总金额字段的字段值分别为 $60000、$350 以及 $25。

“薪资单”的单击钮就会找到这三笔数据并加总显示代垫款总金额为:$60000+$350+$25=$60375

注意事项:
1. 另外加上程序前请确保两张表单都有纪录 Email 以及年月份的字段,并提醒填单人一定要填(或将这些字段设为必填),然后两边的年月份格式要相同,“薪资单”的月份为“2020/07”,“费用报支”的月份(默认为意见栏字段)也要为“2020/07”,不可为其他格式,如果只有月份的话会将历年同月份的费用加总,算出来就不对了。


2. 单击钮是只会加总“已付还?”字段有勾选“Yes”的数据,所以发薪人员记得先到“费用报支”表单勾选有付还的费用。

另外也要确保“已付还?”的字段型态为打勾选项。

再来请依如下步骤设置:
在找到“薪资单”,对该表单单击下右键,并选择 JavaScript 工作流程:


将以下程序代码择一拷贝贴上并保存:
1. 如果你的“薪资单”将加减项以及金额设计在子表格的话:

请贴上以下程序代码:
function generateReimburse(recordId) {
var employeePayrollSheet = db.getAPIQuery("薪资单表单路径"); //括号里换成薪资单sheet path
var expenseSheet = db.getAPIQuery("费用报支单表单路径"); //括号里换成费用报支sheet path
var thisEntry = employeePayrollSheet.getAPIEntry(recordId);
var thisEmployeeEmail = thisEntry.getFieldValue([员工email]字段ID); //括号里换成薪资单[员工email]字段ID
var thisMonth = thisEntry.getFieldValue([该月份]字段ID); //括号里换成薪资单[该月份]字段ID
expenseSheet.addFilter(3000338, '=', thisEmployeeEmail); //括号中第一个参数换成费用报支[员工email]字段ID,如未修改我们模板这里不需修改。
expenseSheet.addFilter(费用报支[该月份]字段ID, '=', thisMonth); //括号中第一个参数换成费用报支[该月份]字段ID
expenseSheet.addFilter(3000335, '=', 'Yes'); //括号中第一个参数换成费用报支[已付还]字段ID,如未修改我们模板这里不需修改。
var results = expenseSheet.getAPIResultList();
var thisMonthEmployPay = 0;
for (var i = 0; i < results.length; i++) {
var entry = results[i];
thisMonthEmployPay = thisMonthEmployPay + Number(entry.getFieldValue(3000352)); //括号中字段ID换成费用报支[总金额]字段ID,如未修改我们模板这里不需修改。
};
thisEntry.setSubtableFieldValue(子表格中[金额]字段ID, -100, thisMonthEmployPay); //括号中第一个参数换成薪资单子表格中[金额]字段ID。
thisEntry.setSubtableFieldValue(子表格中[加项项目名称]字段ID, -100, '代垫款'); //括号中第一个参数换成薪资单子表格中[加项项目名称]字段ID。
//括号中第三个参数单引号中的字可以自行修改,可以改成 '员工该月代垫款' 之类的。
thisEntry.recalculateAllFormulas();
thisEntry.save();
response.setMessage('已生成该员工该月代垫款'); //括号中单引号中的字可以自行修改,可以改成 '运行完成' 之类的。
response.setStatus('SUCCESS');
}
2. 如果你的“薪资单”将代垫款设为独立字段的话:

请贴上以下程序代码:
function generateReimburse(recordId) {
var employeePayrollSheet = db.getAPIQuery("薪资单表单路径"); //括号里换成薪资单sheet path
var expenseSheet = db.getAPIQuery("费用报支单表单路径"); //括号里换成费用报支sheet path
var thisEntry = employeePayrollSheet.getAPIEntry(recordId);
var thisEmployeeEmail = thisEntry.getFieldValue([员工email]字段ID); //括号里换成薪资单[员工email]字段ID
var thisMonth = thisEntry.getFieldValue([该月份]字段ID); //括号里换成薪资单[该月份]字段ID
expenseSheet.addFilter(3000338, '=', thisEmployeeEmail); //括号中第一个参数换成费用报支[员工email]字段ID,如未修改我们模板这里不需修改
expenseSheet.addFilter(费用报支[该月份]字段ID, '=', thisMonth); //括号中第一个参数换成费用报支[该月份]字段ID
expenseSheet.addFilter(3000335, '=', 'Yes'); //括号中第一个参数换成费用报支[已付还]字段ID,如未修改我们模板这里不需修改
var results = expenseSheet.getAPIResultList();
var thisMonthEmployPay = 0;
for (var i = 0; i < results.length; i++) {
var entry = results[i];
thisMonthEmployPay = thisMonthEmployPay + Number(entry.getFieldValue(3000352)); //括号中字段ID换成费用报支[总金额]字段ID,如未修改我们模板这里不需修改
};
thisEntry.setFieldValue([代垫款]字段ID, thisMonthEmployPay); //括号中第一个参数换成薪资单中的[代垫款]字段ID。
thisEntry.recalculateAllFormulas();
thisEntry.save();
response.setMessage('已生成该员工该月代垫款'); //括号中单引号中的字可以自行修改,可以改成 '运行完成' 之类的。
response.setStatus('SUCCESS');
}
1. 更改表单路径
若“薪资单”表单路径为:https://www.ragic.com/accountname/ragicadministration/1
那么请将这行改成:
var employeePayrollSheet = db.getAPIQuery("/ragicadministration/1");
若“费用报支”表单路径为:https://www.ragic.com/accountname/ragicadministration/25
那么请将下一行改成:
var expenseSheet = db.getAPIQuery("/ragicadministration/20005");
2. 更改字段 ID
(1) 找到以下程序代码:
var thisEmployeeEmail = thisEntry.getFieldValue([员工email]字段ID);
将“薪资单”员工 “email” 字段 ID 改成真的字段 ID,如员工 “email”字段 ID 为 1013791:

请将这行改成:
var thisEmployeeEmail = thisEntry.getFieldValue(1013791);
(2) 承上一点做法,将下一行“薪资单”的“该月份” 字段 ID 改成真的字段 ID,例:
var thisMonth = thisEntry.getFieldValue(1013790);
(3) 找到以下三行:
expenseSheet.addFilter(3000338, '=', thisEmployeeEmail); expenseSheet.addFilter(费用报支[该月份]字段ID, '=', thisMonth); expenseSheet.addFilter(3000335, '=', 'Yes');
第一行的 3000338 为“费用报支”模块的“电邮”字段 ID,如果没有删除该字段的话可以直接保留这行不用做修改,如果删除或是想用其他电邮字段的话请改成其他电邮字段的字段 ID,例如其他电邮字段的字段 ID 为 1000234 的话可以改成:
expenseSheet.addFilter(1000234, '=', thisEmployeeEmail);
第三行的 3000335 为“费用报支”模块的“已付还?”字段 ID,修改逻辑同第一行。
第二行比较特别,设计逻辑上是希望薪资单的年月份会抓到该月份的代垫款,所以“费用报支”也需要有记录年月份的字段,完全不改模块不额外新增字段的话,可以选择“商业用途”或是“意见栏”字段。

选择“商业用途”的话就可以改成:
expenseSheet.addFilter(3000355, '=', thisMonth);
也可以自行新增“年月份”字段,并填上“年月份”字段 ID。
(4) 承上一点,找到以下这行,3000352 为“费用报支”的“总金额”字段 ID,有改表单设计再修改即可:
thisMonthEmployPay = thisMonthEmployPay + Number(entry.getFieldValue(3000352));
(5) 如果你的“薪资单”将加减项以及金额设计在子表格的话请找到以下这两行:
thisEntry.setSubtableFieldValue(子表格中[金额]字段ID, -100, thisMonthEmployPay); thisEntry.setSubtableFieldValue(子表格中[加项项目名称]字段ID, -100, '代垫款');
并找到子表格中的对应字段替换上去,替换完会像是这样:
thisEntry.setSubtableFieldValue(1013786, -100, thisMonthEmployPay); thisEntry.setSubtableFieldValue(1013785, -100, '代垫款');
如果你的“薪资单”将代垫款设为独立字段的话,请找到以下这行:
thisEntry.setFieldValue([代垫款]字段ID, thisMonthEmployPay);
并找到对应代垫款字段替换上去,替换完会像是这样:
thisEntry.setFieldValue(1013793, thisMonthEmployPay);
3. 更改填入项目名称以及显示信息
这个功能的设计为单击完单击钮会显示信息:

而图中的信息是可以修改的,也可以选择不修改,要修改的话请找到以下这行:
response.setMessage('已生成该员工该月代垫款');
将单引号中的字改成想要的字即可,例如:
response.setMessage('已生成本月代垫款');
同样道理,如果你的“薪资单”将加减项以及金额设计在子表格的话填入的项目名称也可以做修改,欲修改的话可以找到以下这行:
thisEntry.setSubtableFieldValue(子表格中[加项项目名称]字段ID, -100, '代垫款');
将单引号中的:代垫款,改成其他字,例如:
thisEntry.setSubtableFieldValue(子表格中[加项项目名称]字段ID, -100, '本月员工代垫款');
最后编辑完成后请务必点选左上角保存,程序修改才会生效喔。

进到“薪资单”表单页修改设计,找到左侧的表单设置 > 动作单击钮,单击钮名称可以自取,单击钮类型选:JS Workflow,然后在动作贴上:generateReimburse({id})
最后点选:新增单击钮即可。
修改完记得也要保存设计喔。
