Google Spreadsheet Query IF(ISBLANK(), PARSE_ERROR:

Google Spreadsheet Query IF(ISBLANK(), PARSE_ERROR:

通过这个查询,我得到了这个结果。这个想法是我有销售产品的日期。当检查日期是否在营销 table 的 date_start 和 date_end 之间时,如果是,则将该价格放入营销价格中。

在某些情况下没有尽头。这意味着它仍然是 运行 并且没有结束日期。我们仍然使用它们。 因为没有结束日期,所以我想使用今天的日期。因此,如果 E (date_end) 为空,则使用今天日期,否则使用 E​​

=query(Marketing!$B:E,
"select C,D  where  B='" & D2 & "' and 
D<=date '"&TEXT(E2,"yyyy-MM-dd")&"' and 
date'"&TEXT(today(),"yyyy-MM-dd")&"'>=date '"&TEXT(E2,"yyyy-MM-dd")&"' ")

+------------+---------------+--------+-----------------+----------+----------------+
| product_no | product_price | amount | deliver_country |  datum   | marketingprice |
+------------+---------------+--------+-----------------+----------+----------------+
|       1001 |           2.8 |      2 | de              | 2-1-2020 |                |
+------------+---------------+--------+-----------------+----------+----------------+
+-----+------------+
| 3.2 | 01-01-2020 |
| 1.2 | 02-01-2020 |
+-----+------------+

我想使用 IF(isblank(E),date'"&TEXT(TODAY(),"yyyy-MM-dd")&"', E)

那么代码就是

=query(Marketing!$B:E,
"select C,D  where  B='" & D2 & "' and 
D<=date '"&TEXT(E2,"yyyy-MM-dd")&"' and 
IF(isblank(E),date'"&TEXT(today(),"yyyy-MM-dd")&"',E)>=date '"&TEXT(E2,"yyyy-MM-dd")&"' ")

然后我得到一个错误:

QUERY: PARSE_ERROR: Encountered " "IF "" at line 1, column 58. Was expecting one of: "(" ... "(" ...

营销Table

+---------+---------+-------+-------------+------------+
| channel | country | price | date_start  |  date_end  |
+---------+---------+-------+-------------+------------+
| Google  | de      |   3.2 | 01-01-2020  | 01-01-2020 |
| Google  | de      |   1.2 | 02-01-2020  |            |
| Amazon  | en      |   5.4 | 01-01-2020  |            |
+---------+---------+-------+-------------+------------+

输出应该如何

+------------+---------------+--------+-----------------+----------+----------------+
| product_no | product_price | amount | deliver_country |  datum   | marketingprice |
+------------+---------------+--------+-----------------+----------+----------------+
|       1001 |           2.8 |      2 | de              | 2-1-2020 |            1.2 |
|       1002 |           3.8 |      4 | en              | 3-1-2020 |            5.4 |
|       1001 |           2.8 |      1 | de              | 1-1-2020 |            3.2 |
+------------+---------------+--------+-----------------+----------+----------------+

在mysql中我使用了这个代码:

b.start_date                <= date(i.system_created)                                           AND   
coalesce(b.end_date,now())  >= date(i.system_created)

我自己找到的解决方案:

=QUERY(Marketing!$B:$E;IF(Marketing!E:E="";
"select E where  B ='"&D2&"' and D <=date'"&TEXT(E2;"yyyy-MM-dd")&"' and date'"&TEXT(VANDAAG();"yyyy-MM-dd")&"' >=date'"&TEXT(E2;"yyyy-MM-dd")&"' limit 1";
"select E where  B ='"&D2&"' and D <=date'"&TEXT(E2;"yyyy-MM-dd")&"' and E >=date'"&TEXT(E2;"yyyy-MM-dd")&"'"
);0)

尝试:

=ARRAYFORMULA(IFERROR(QUERY(
 {Marketing!B:D\ IF(Marketing!E:E=""; TODAY(); Marketing!E:E)}; 
 "select Col2 
  where Col1 = '"&D2&"' 
    and Col3 <= date '"&TEXT(E2;"yyyy-MM-dd")&"' 
    and Col4 <= "&TODAY()&"
  limit 1"; 0)))

您可以使用 Apps 脚本 来解决这个问题。

它是如何工作的?

  1. 销售数据D2:E7)分配给sales变量,营销数据 (B2:E7) 到 marketing 变量。
  2. in for 循环遍历 sales,如果 sale_date < date_start 将单元格值设置为 marketing_cost - 1

您可以在下面找到前后的屏幕截图。

function worker(){

  let ss = SpreadsheetApp.getActive();
  let sheetSales = ss.getSheetByName("Sales");
  let sheetMarketing = ss.getSheetByName("Marketing");

  // 1.
  let sales = sheetSales.getRange("D2:E7").getValues();
  /** sales
  [
    [de, 02-01-2020],
    [de, 03-01-2020],
    [de, 04-01-2020],
    [de, 06-01-2020],
    [de, 10-01-2020],
    [en, 10-01-2020]
  ]
  */
  let marketing = sheetMarketing.getRange("B2:E7").getValues();
  /** marketing
  [
    [de, 3.2, 01-01-2020, 02-01-2020],
    [de, 1.2, 03-01-2020, 04-01-2020],
    [de, 4.4, 05-01-2020, 06-01-2020],
    [de, 8.8, 07-01-2020, 08-01-2020],
    [de, 9.9, 09-01-2020, 25-02-2020],
    [en, 5.4, 01-01-2020, 25-02-2020]
  ]
  */

  let sale_date,
  date_start,
  date_end, 
  marketing_cost = [];

  for(let i = 0; i < sales.length; i++){

    sale_date = new Date(sales[i][1]);
    date_start = new Date(marketing[i][2]);
    date_end = new Date(marketing[i][3]);
    marketing_cost.push(marketing[i][1]);

    // 2.
    if(sale_date < date_start){
      sheetSales.getRange(2+i, 6).setValue(marketing_cost[i-1]);
    }else{
      sheetSales.getRange(2+i, 6).setValue(marketing_cost[i]);
    }
  }

}

之前:

之后:

参考: