【问题标题】:Generating invoice numbers based on Financial Year in Google Sheet根据 Google 表格中的财政年度生成发票编号
【发布时间】:2023-03-18 05:38:01
【问题描述】:

我正在使用 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)并且我希望 发票编号是静态的,以后不要更改。

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

【问题讨论】:

  • 这真的是google-apps-script 的问题吗?如果没有,您应该从问题中删除该标签。 (看起来好像您需要基于公式的解决方案,而不是基于脚本的解决方案。)
  • 您是否尝试使用基于脚本的方法自己解决此问题?如果是这样,这将有助于在问题中看到。

标签: google-apps-script google-sheets google-sheets-formula


【解决方案1】:

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

结果

如您所见,每张发票都会计数,但一旦新的财政年度开始,计数器就会重置。

【讨论】:

  • 感谢您的支持!但似乎代码无法正常工作。你能检查一下吗?我留下下面电子表格的链接。链接:docs.google.com/spreadsheets/d/…
  • 您的工作表是私有的,可以通过链接查看或公开。另外,究竟是什么不起作用?您是否更改了 sheet 变量以使其适合您的工作表?
  • 这不起作用,因为您将某些 A 和 B 行留空,填充所有必要的单元格(A 和 B 4、5、6 等)。要么这样,要么我必须稍微更改一下代码
  • 是的,我已经尝试按照您所说的填充空白单元格。但是没有变化。我已经尝试了我所知道的方法。但我无法理解问题的原因。我很感激你尝试过伸出援手。但是,正如您所说,“B 列”将根据“A 列”中输入的日期自动填充。并且,“A 列”不是按顺序输入的。它将始终以随机行的形式输入(根据要求)。
  • 另外,我将在此处留下一个新的电子表格链接,其中包含相同的数据 docs.google.com/spreadsheets/d/…>。如果需要,您可以浏览并进行任何必要的更改。 (如果有,请忽略之前的电子表格链接)
【解决方案2】:

我在您的最新文档“发票样本”中添加了标签 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);
    }
}

【讨论】:

  • 最后,Stack 人群中有人完全理解了我的问题并提出了解决方案。非常感谢,伙计!这对我有用!请保持好的工作状态。你绝对值得掌声。再次感谢!
  • 嘿,我想在“A 列”之前再插入 3 列[A 列将是第 4 列]。您能否让我知道脚本中的更改(以及公式)。因为我不擅长脚本。如果您需要,这里是工作表的链接。 docs.google.com/spreadsheets/d/…
  • 插入 3 列,表格公式将自动调整。代码更改:
  • 插入 3 列,表格公式将自动调整。代码更改: columnStart !== 4 在任何地方都有一个按字母引用的列,将字母更改为 3 columns 。例如H2:I 变为 K2:L CFYrng = sh.getRange("K2:L20");
  • 确实有效。感谢您帮助我!
猜你喜欢
  • 2023-01-25
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 1970-01-01
  • 2015-07-01
  • 1970-01-01
  • 2014-07-20
  • 2012-02-11
相关资源
最近更新 更多