วิธีกรอกหลายแผ่นงานทุกครั้งที่ส่งแบบฟอร์ม Google

ฉันได้สร้าง Apps Script ที่เรียบง่ายซึ่งอิงตามคำตอบที่ให้ไว้ในแบบฟอร์ม Google ทำสำเนาเทมเพลต (แผ่นงานในสเปรดชีตคำตอบของแบบฟอร์ม) และกรอกข้อมูลด้วยข้อมูลที่ป้อน นี่เป็นส่วนหนึ่งของรหัส:

function fichas() {
var formato = SpreadsheetApp.getActiveSpreadsheet();
var ficha = formato.duplicateActiveSheet();
var respuestas = SpreadsheetApp.openById('ID').getSheetByName('Form Responses');

var name = respuestas.getRange(**2**, 5);
var apellido = ficha.getRange(4, 2);
name.copyTo(apellido);

var name2 = respuestas.getRange(**2**, 6);
var apellido2 = ficha.getRange(4, 3);
name2.copyTo(apellido2);

ตัวเลขตัวหนาแสดงถึงข้อมูลของผู้ใช้คนแรก ฉันได้ตั้งค่าทริกเกอร์ที่เรียกใช้สคริปต์เมื่อมีการส่งแบบฟอร์ม ตอนนี้สิ่งที่ฉันไม่รู้ว่าต้องทำอย่างไรคือจะย้ายไปยังแถวถัดไปเพื่อใช้ข้อมูลของผู้ใช้คนถัดไปได้อย่างไร (กล่าวคือฉันต้องการเพิ่มตัวหนาทีละหนึ่งโดยอัตโนมัติทุกครั้งที่สคริปต์ทำงาน) เป็นไปได้ไหม? ฉันยังใหม่กับสิ่งนี้และฉันกำลังพยายามเรียนรู้ แต่บางครั้งก็ยากเกินไป!

ผมขอขอบคุณความช่วยเหลือของคุณ!

จอร์จ


person user2578210    schedule 16.07.2013    source แหล่งที่มา


คำตอบ (1)


คุณควรใช้ตัวแปรที่ใช้ร่วมกันกับผู้ใช้ทุกคนและคุณเพิ่มค่าในการส่งแบบฟอร์มแต่ละครั้ง มีวิธีที่เป็นไปได้สองสามวิธีในการบรรลุเป้าหมาย ทำไมไม่ลอง script Properties ? มันค่อนข้างง่ายที่จะนำไปใช้:

ขั้นแรกให้เริ่มต้นด้วยคำสั่งดังนี้:

ScriptProperties.setProperty('rowValue', 1);// this must happen only once, you could insert it in a small function to "initialize"

จากนั้นในรหัสของคุณคุณสามารถดึงข้อมูลได้โดยใช้

var rowValue = Number(ScriptProperties.getProperty('rowValue'));

เพิ่มขึ้นโดยใช้ rowValue++ และเขียนกลับไปยังที่เก็บข้อมูล ... โปรดจำไว้ว่าคุณสามารถแก้ไขค่านี้ได้โดยตรงในคุณสมบัติสคริปต์ (ตัวแก้ไขสคริปต์> ไฟล์> คุณสมบัติโครงการ> คุณสมบัติโครงการ)

ScriptProperties.setProperty('rowValue', rowValue);

นี่จะสมบูรณ์แบบหากคุณไม่เคยได้รับผู้ใช้มากกว่าหนึ่งรายส่งแบบฟอร์มพร้อมกัน ในกรณีนี้มีความเสี่ยงที่สคริปต์จะผสมค่า...

มีบริการอื่นที่ออกแบบมาเพื่อจัดการกับสถานการณ์นี้: บริการล็อค

เอกสารให้ตัวอย่างที่ชัดเจนเกี่ยวกับวิธีการนำไปใช้ : ดำเนินไปดังนี้:

 var lock = LockService.getPublicLock();
 try {
   lock.waitLock(10000);
 } catch (e) {
   Logger.log('Could not obtain lock after 10 seconds.');
 }

ทำสิ่งที่คุณต้องทำ เพิ่มตัวนับ... และเมื่อคุณใช้งานเสร็จแล้ว

lock.releaseLock();

อาจดูซับซ้อนแต่ไม่ใช่ ;-) และมันจะทำงานได้อย่างไร้ที่ติในทุกสถานการณ์ที่เป็นไปได้... ลองดูสิ

person Serge insas    schedule 16.07.2013
comment
ขอบคุณมาก ๆ สำหรับความช่วยเหลือของคุณ! อย่างที่ผมบอกไปก่อนหน้านี้ว่าผมกำลังเรียนรู้ที่จะทำสิ่งนี้และผมไม่มีประสบการณ์ในการเขียนโปรแกรมเลย... พูดตามตรงว่าผมพยายามทำสิ่งที่คุณแนะนำแต่ผมยังไม่ชัดเจนว่าต้องทำอย่างไร ดังนั้นเห็นได้ชัดว่าผมทำไม่ได้ มันได้ผล คุณจะกรุณาช่วยฉันหน่อยได้ไหม? ฉันซาบซึ้งกับเวลาและความพยายามของคุณจริงๆ! - person user2578210; 18.07.2013
comment
คุณหมายถึงอะไรโดย 'เขียนกลับไปยังที่เก็บข้อมูล'? ฉันสามารถทำให้สคริปต์กรอกเทมเพลตของฉันได้ แต่ฉันไม่สามารถเพิ่ม rowValue สำหรับเทมเพลตถัดไปได้ - person user2578210; 19.07.2013