微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Google 表格中根据财政年度生成发票编号

如何解决在 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 中),而且我希望发票编号是静态的,以后不会更改。

(请告诉我解决此问题的脚本或公式)

Screenshot

解决方法

针对您的问题,我想出了一个 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];
  }
}

结果

如您所见,它对每张发票进行计数,但一旦新的财政年度开始,计数器就会重置。 enter image description here

,

我在您的最新文档“发票示例”中添加了标签 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?