appendRow ส่งคืน [Ljava.lang.Object; @ แทนค่า
ฉันต้องการคัดลอกการส่งแบบฟอร์มไปยังแผ่นงานอื่นเพื่อให้สามารถแก้ไขข้อมูลที่คัดลอกได้โดยไม่กระทบกับการส่งต้นฉบับ
ฉันมีรหัสต่อไปนี้:
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มันก็ใช้ได้ดี แต่ฉันต้องการให้ข้อมูลที่คัดลอกในคอลัมน์แตกต่างจากข้อมูลแรก
คำตอบ
คำอธิบาย:
- แนวทางการใช้
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);
}
ทำไมต้อง 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 เพื่อใช้ประโยชน์จากคุณสมบัติภาษาใหม่และความเร็วที่ดีขึ้น
rowตัวแปรมีอาร์เรย์ดังนั้นคุณควรใช้ประกอบการแพร่กระจายด้วยappendRow
แทนที่:
tracker.appendRow([null,row[0]]);
กับ:
tracker.appendRow([null,...row[0]]);
ตรวจสอบให้แน่ใจว่าโครงการของคุณเปิดใช้งานรันไทม์ Chrome V8