appendRow ส่งคืน [Ljava.lang.Object; @ แทนค่า

Sep 28 2020

ฉันต้องการคัดลอกการส่งแบบฟอร์มไปยังแผ่นงานอื่นเพื่อให้สามารถแก้ไขข้อมูลที่คัดลอกได้โดยไม่กระทบกับการส่งต้นฉบับ

ฉันมีรหัสต่อไปนี้:

function copy2(){
  var responses = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("from");
  var tracker =  SpreadsheetApp.getActiveSpreadsheet().getSheetByName("to");
  var lastrow = responses.getLastRow();
  var col = responses.getLastColumn();
  var row = responses.getRange(lastrow, 1, 1, col).getValues();

  tracker.appendRow([null,row[0]]);

การใช้nullในappendRowช่วยให้คุณย้ายข้อมูลไปยังคอลัมน์ถัดไป อย่างไรก็ตามมันใช้ไม่ได้กับrow[0]อาร์เรย์ ถ้าฉันลบnullมันก็ใช้ได้ดี แต่ฉันต้องการให้ข้อมูลที่คัดลอกในคอลัมน์แตกต่างจากข้อมูลแรก

คำตอบ

3 Marios Sep 28 2020 at 18:30

คำอธิบาย:

  • แนวทางการใช้nullเป็นวิธีแก้ปัญหาอย่างชัดเจนและไม่ใช่วิธีแก้ปัญหาในอนาคต กล่าวคือถ้าคุณต้องการเริ่มวางจากคอลัมน์ 4 คุณจะต้องทำ[null,null,null,...row[0]]ซึ่งไม่ใช่วิธีที่เหมาะสมในความคิดของฉัน
  • ฉันขอแนะนำให้คุณกำจัดappendRowและnullเนื่องจากคุณต้องการวางข้อมูลจากคอลัมน์ที่สองเป็นต้นไป ดังนั้นควรใช้setValues()แทน

แทนที่:

tracker.appendRow([null,row[0]]);

กับ:

tracker.getRange(tracker.getLastRow()+1,2,1,row[0].length).setValues(row);


โซลูชั่นที่สมบูรณ์:

function copy2(){
  var responses = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("from");
  var tracker =  SpreadsheetApp.getActiveSpreadsheet().getSheetByName("to");
  var lastrow = responses.getLastRow();
  var col = responses.getLastColumn();
  var row = responses.getRange(lastrow, 1, 1, col).getValues(); 
  tracker.getRange(tracker.getLastRow()+1,2,1,row[0].length).setValues(row);
}
4 OlegValter Sep 28 2020 at 18:31

ทำไมต้อง Ljava.lang.Object?

เนื่องจากคุณกำลังใช้ Rhino runtime รุ่นเก่าที่เขียนด้วย Java ดังนั้นเมื่อมีสิ่งที่ไม่คาดคิดเกิดขึ้นคุณจะเห็นโครงสร้างพื้นฐานของ GAS ที่สร้างขึ้น ตอนนี้java.lang.objectเป็นคลาสฐานใน Java ซึ่งมาจากออบเจ็กต์อื่น ๆ รวมถึงอาร์เรย์

เนื่องจากappendRowพารามิเตอร์เดียวของลายเซ็นของเมธอดยอมรับอาร์เรย์ของค่าหนึ่งมิติของคุณrow[0]ซึ่งมีอาร์เรย์ (ดูว่าgetvaluesวิธีการใดที่ส่งคืน) จึงทำให้มันเป็นแท็กสตริงที่ระบุว่านี่เป็นอ็อบเจ็กต์ในรันไทม์

ไปทำอะไรที่ Rhino?

การแก้ปัญหาทั้งหมดขึ้นอยู่กับการ[ null ]เป็นอาร์เรย์ฐานของคุณและใช้เพื่อผนวกส่วนที่เหลือของแถวแรกบางสิ่งบางอย่างเช่นนี้:concat [ null ].concat(row[0])คุณยังสามารถใช้pushกับforลูปธรรมดาเพื่อประสิทธิภาพที่ดีขึ้น

จะทำอย่างไรใน V8 0 ?

เป็นคำตอบที่อื่น ๆ ที่กล่าวถึงทางออกที่ดีที่สุดของคุณคือไวยากรณ์การแพร่กระจาย คุณยังสามารถทำpush(...row[0])เพื่อหลีกเลี่ยงการต่ออาร์เรย์ (เนื่องจากคุณใช้และทิ้งสำเนาที่เป็นผลมาจาก[ null, ...row[0] ]ทันที)


0ดูเอกสารอย่างเป็นทางการเกี่ยวกับวิธีการเปลี่ยนไปใช้ V8 เพื่อใช้ประโยชน์จากคุณสมบัติภาษาใหม่และความเร็วที่ดีขึ้น

3 AmitAgarwal Sep 28 2020 at 18:18

rowตัวแปรมีอาร์เรย์ดังนั้นคุณควรใช้ประกอบการแพร่กระจายด้วยappendRow

แทนที่:

tracker.appendRow([null,row[0]]);

กับ:

tracker.appendRow([null,...row[0]]);

ตรวจสอบให้แน่ใจว่าโครงการของคุณเปิดใช้งานรันไทม์ Chrome V8