如何解决在 Google 表格中根据财政年度生成发票编号
我正在使用 Google 表格来生成发票编号。我需要帮助根据从每年 4 月 1 日开始到 3 月结束的财政年度生成发票编号。
我希望它为每个新的财政年度重新开始计数。例如,对于 2021 财年,发票编号将为“ETL/2021-22/001”、“ETL/2021-22/002”,对于下一个财年,发票编号将为“ETL/2022-23/ 001”、“ETL/2022-23/002”等
我知道如何从输入的日期获取财政年度。但我需要帮助计算本财年的发票编号,然后重新开始计算下一财年的发票编号,依此类推。
- A 列:为发票输入的日期
- B 列:使用公式生成的 FY
=IF(A:A<>"",IF(MONTH(A:A)<4,YEAR(A:A)-1 &"-"&Right(YEAR(A:A),2),YEAR(A:A) &"-"&right(YEAR(A:A)+1,2)),"")
- C 列:这是我想要的结果。
- D 列:收到发票的个人/实体的名称。
问题: 现在,如下图所示,如果我首先要为“D 人”开具发票,然后为“A 人”开具发票,我希望发票编号是连续的(如发票日期在 FY 中),而且我希望发票编号是静态的,以后不会更改。
(请告诉我解决此问题的脚本或公式)
解决方法
针对您的问题,我想出了一个 Apps 脚本解决方案。正如您所指出的,这也是连续和静态的。
脚本
可能需要更改的唯一变量在第一行,那就是工作表的名称。我已经将我的名称称为 invoice
,但您可以将其更改为您的工作表的名称。
function generateInvoiceNumbers() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('invoice');
const range = sheet.getRange(2,2,sheet.getLastRow() - 1,3).getValues();
let rowNum = 2;
let lastRow,number;
for (const row of range) {
if (lastRow != row[0]){
number = 1;
}
let string;
if (number < 10) {
string = '00' + (number);
} else if( number > 9 && number < 100) {
string = '0' + (number);
} else {
string = number;
}
sheet.getRange(rowNum,3).setValue(`ETL/${row[0]}/${string}`)
number++;
rowNum++;
lastRow = row[0];
}
}
结果
如您所见,它对每张发票进行计数,但一旦新的财政年度开始,计数器就会重置。
,我在您的最新文档“发票示例”中添加了标签 invoice1 和一个 onEdit 脚本。所有日期都已从 A 列中删除。如果您按选定的顺序一次输入一个,脚本应按照您的准则填充 C 列。
脚本使用辅助列 H 和 I。两者都是由公式生成的,但只有列 I 在添加新日期时发生变化。它将始终显示为列表中的每个 FY 分配的下一个三位数字。您可以隐藏这两列。
脚本很粗糙,我确定没有遵循推荐的约定,因为我充其量只是一个新手。它需要知识渊博的人来工作。
function onEdit(e) {
// invoice1 tab
// when a date is entered into column A,column B populates by formula and
// this script should create the invoice number in column C with the next number
// for the relevant FY. The next number is maintained in column I by formula.
var sh = e.source.getActiveSheet();
if (sh.getName() !== "invoice1" || e.range.columnStart !== 1 ) return;
CFYrng = sh.getRange("H2:I20");
CFYvals = CFYrng.getValues();
var Invrng = sh.getRange("C" + e.range.rowStart);
if(e.range.getValue() === '') Invrng.clearContent();
if(Invrng.getValue() === '') {
var FYrng = sh.getRange("B" + e.range.rowStart);
FY = FYrng.getValue();
for (i = 0; i < 19; i++){
if(CFYvals[i][0] === FY){
invn = CFYvals[i][1];
}
}
var invoice = "ETL/" + FY + "/" + invn;
Invrng.setValue(invoice);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。