在表单提交中使用新行时,sp​​lit切断重要的表单条目信息

问题描述

我正在尝试传递Woocommerce订单上重力形式提交的信息,以便在使用Zapier的另一个应用程序中使用。我需要对表单条目信息进行拆分,以使信息不会全部位于一行上,并且可以单独访问。

由于我对JavaScript还是很陌生,所以我一直在努力几个小时才能使其工作……我正在使用的代码来自woocommerce文档。问题在于,如果所述信息继续到新行,则可以截断大量信息。请查看下面的拆分结果,并参考问题2 以了解我在说什么。

代码

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<textarea id="myTextarea" cols="50" rows="4" placeholder="Enter text"></textarea>
<br>
<button onclick="getText()">
Split 
</button>

表单提交示例如下:

 // Define "MetaData" in the Input Data section. Ignore the "No Data" label.
// Reformat Resource Meta Data to generate keyvalue pairs.
// In case of multiple equal keys,only the last value available.
const buffer = {};
const MetaData = inputData.MetaData.split(/\n+/);
MetaData.forEach((dataString,index) => {
  if (dataString.includes('id:')) {
    const key = MetaData[index + 1].replace('key:','').trim();
    const value = MetaData[index + 2].replace('value:','').trim();
    buffer[key] = value;
  }
});
return buffer;

拆分结果如下:

Name: John
Last Name: Doe
Email: john.doe@gmail.com
Question 1: this is my first question
Question 2: hi there,this is my second question..

            regards,john doe
Question 3: This is my third question

如您所见,问题2基本上消失了。我一直无法找到一种使此工作正常进行的方法。我希望有人能够在这里帮我一个忙...

编辑 __________________

按要求进行RAW:

Name: John

Last Name: Doe

Email: john.doe@gmail.com

Question 1: this is my first question

Question 2: hi there,Question 3: This is my third question

预期的结果:

id: 419*** key: _gravity_forms_history value: {'_gravity_form_cart_item_key': '************************************','_gravity_form_linked_entry_id': ****,'_gravity_form_lead': {'2': 'This is my first question','6': 'john.doe@gmail.com','7': '2020-08-01','8': 'hi there,\r\nthis is my second question..\r\n\r\nregards,john doe','9': 'This is my third question','11': 0,'12': this is a random form entry','form_id': '3','source_url': 'https://***************************/','ip': ***************','5.2': '','5.3': 'John','5.4': '','5.6': 'Doe','5.8': '','10.1': 'Product Name','10.2': '$0.00','10.3': '1'},'_gravity_form_data': {'id': '3','bulk_id': 0,'display_title': False,'display_description': False,'disable_woocommerce_price': 'no','price_before': '','price_after': '','disable_calculations': 'yes','disable_label_subtotal': 'yes','disable_label_options': 'yes','disable_label_total': 'yes','disable_anchor': 'no','label_subtotal': 'Subtotal','label_options': 'Options','label_total': 'Total','use_ajax': 'no','enable_cart_edit': 'no','enable_cart_edit_remove': 'yes','keep_cart_entries': 'no','send_notifications': 'no','enable_cart_quantity_management': 'no','cart_quantity_field': '','update_payment_details': 'no','display_totals_location': 'after','structured_data_override': 'no','structured_data_low_price': '','structured_data_high_price': '','structured_data_override_type': 'append'}}
 
id: 419***
key: Name
value: John Doe

id: 419***
key: Email
value: john.doe@gmail.com

id: 419***
key: Date of Birth
value: 01.08.2020

id: 419***
key: Question 1
value: This is my first question

id: 419***
key: Question 2
value: hi there,this is my second question..
regards,john doe

id: 419***
key: Question 3
value: This is my third question

id: 419***
key: Final Entry (Optional)
value: this is a random form entry

当前请求的结果:

Name: John Doe

Email: john.doe@gmail.com

Date of Birth: 01.08.2020

Question 1: This is my first question

Question 2 :Hi There,This Is My Second Question..

            Regards,John Doe

Question 3: This is my third question

Final Entry: this is a random form entry

id: ******************************

runtime_Meta:

memory_used_mb: 72

duration_ms: 100

logs:

async: false

解决方法

拆分结果如下:

Name: John
Last Name: Doe

Email: john.doe@gmail.com

Question 1: this is my first question

Question 2: hi there,Question 3: This is my third question

不,不,不,不,不。这就是您认为的结果。您的代码中有错误,并且您选择相信split函数而不是代码是错误的。

在您的forEach循环中,添加一行,例如

console.log('XXXX',dataString);

紧邻if (dataString.includes('id:')) {行上方。您会看到输入的每一行都以XXXX前缀注销,包括您声称丢失的每一行。

那么为什么 您的代码没有执行您想要的操作?好,让我们看一下forEach调用的函数的内容:

if (dataString.includes('id:')) {
  const key = metaData[index + 1].replace('key:','').trim();
  const value = metaData[index + 2].replace('value:','').trim();
  buffer[key] = value;
}

它是做什么的?如果文件的一行包含id:,请从下一行及其后的行中获取键和值。如果文件行中不包含id:,请不要对其进行任何操作。

在您的情况下,问题2包含多行,如我们所见,您的代码完全忽略了这一行。

如果您想要读取的所有行(包括但不包括带有id:的下一行,而不是仅读取值中的下一行),请尝试以下操作:

  if (dataString.includes('id:')) {
    const key = metaData[index + 1].replace('key:','').trim();
    let value = metaData[index + 2].replace('value:','').trim();
    
    let index2 = index + 3;
    while (index2 < metaData.length && !metaData[index2].includes('id:')) {
      value += "\n" + metaData[index2].trim();  
      index2 += 1;
    }
    
    buffer[key] = value.trim();
  }
,

您可以使用正则表达式分隔条目,然后将结果简化为键值对

import win32gui

the_window_hwnd = win32gui.GetForegroundWindow()  # hwnd of the specific window,it could be whatever you what
left_top_x,left_top_y,*useless_position = win32gui.GetWindowRect(the_window_hwnd) # get the position of window you gave.

mouse_pos_x,mouse_pos_y = win32gui.GetCursorPos()
pos_in_window_x,pos_in_window_y = (mouse_pos_x - left_top_x),(mouse_pos_y - left_top_y)

print(pos_in_window_x,pos_in_window_y)

JsFiddle