ฉันจะให้ Google ชีตอัปเดตการอ้างอิงอัตโนมัติไปยังชีตอื่นได้อย่างไร


20

ฉันใช้แอปพลิเคชันภายนอกเพื่อป้อนข้อมูลลงในสเปรดชีตของ Google สมุดงานนี้ถูกอ้างอิงโดยสมุดงานแยกต่างหาก (พร้อมIMPORTRANGE(spreadsheet_key, range_string)ฟังก์ชัน) ที่จัดการและตีความข้อมูล ปัญหาของฉันคือเมื่อใดก็ตามที่ฉันแก้ไขเวิร์กบุ๊กที่อ้างอิงเป็นการส่วนตัวเวิร์กบุ๊กการอ้างอิงก็อัปเดตได้ดี แต่เมื่อใดก็ตามที่แอปพลิเคชันภายนอกแก้ไขมันจะไม่ได้รับการอัปเดต

ฉันได้ลองแก้ไข "การตั้งค่าสเปรดชีต" เพื่อให้การคำนวณใหม่เสร็จสิ้นทุกนาทีและทุกการเปลี่ยนแปลง นอกจากนี้ฉันยังได้ติดตั้งส่วนขยายใน Google Chrome ที่รีเฟรชหน้าเว็บอัตโนมัติทุกชั่วโมง อย่างไรก็ตามข้อมูลไม่ได้รับการนำเข้าอีกครั้งจากสมุดงานอ้างอิง แม้ว่าฉันจะคัดลอกสูตรไปยังเซลล์ใหม่ข้อมูลก็ยังไม่ถูกนำเข้าอีกครั้ง

มีสิ่งใดบ้างที่ฉันสามารถทำกับเวิร์กบุ๊กอ้างอิงเพื่อเปิดใช้งาน Google ชีตเพื่อนำเข้าข้อมูลอีกครั้งได้หรือไม่

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

แก้ไข:นอกจากนี้คำถามนี้ไม่เหมือนกับฉันจะเชื่อมโยงเซลล์ใน Google Spreadsheets กับเซลล์ในเอกสารอื่นได้อย่างไร เพราะฉันใช้ฟังก์ชันที่ให้เป็นคำตอบสำหรับคำถามนั้นเพื่อนำเข้าข้อมูลจากสเปรดชีต ปัญหาไม่ใช่วิธีการนำเข้าข้อมูล แต่เป็นวิธีการอัปเดตแหล่งที่มาของข้อมูล ข้อสันนิษฐานของฉันคือ Google จะดูแลเรื่องนี้ให้ฉัน แต่ข้อมูลใน "แผ่นอ้างอิง" ไม่ได้รับการอัปเดตและวิธีเดียวที่ฉันสามารถหาได้ในการอัปเดตคือไปที่แผ่นข้อมูลต้นฉบับ "และแก้ไขด้วยตัวเอง


ฉันไม่ทราบรายละเอียดของวิธีการทำงาน แต่ฉันใช้สิ่งต่อไปนี้: ifttt.com/google_drive
tlewis3348

@pnuts คุณสามารถอธิบายสิ่งที่คุณหมายถึงโดย "มั่นใจว่ารุ่นที่เหมาะสมจะใช้เป็นแหล่งที่มา"? ฉันมีการตั้งค่าสำหรับแผ่นงานทั้งสองชุดให้อัปเดตทุกนาทีและตั้งค่าแท็บให้รีเฟรชทุกนาที ฉันจะอัปเดตแหล่งที่มาได้อย่างไรที่ไหนและอย่างไร
tlewis3348

@pnuts ข้อมูลถูกแสดงในseparate workbookโอเคแล้ว ดูเหมือนว่ามันเพิ่งถูกพิมพ์ออกมา
tlewis3348

ใช่นี่คือ Google ชีตใหม่ สมุดงานหนึ่งเล่มแสดงข้อมูลที่ถูกเพิ่มและสมุดงานอื่นไม่แสดง ฉันจะเพิ่มสิ่งนี้ลงในคำถามต้นฉบับเพื่อการชี้แจง
tlewis3348

คำตอบ:


14

ฉันดิ้นรนกับปัญหาเดียวกัน แทนการเขียนฟังก์ชั่นที่กำหนดเองฉันจะเพิ่มสตริงแบบสอบถามที่แตกต่างกันไปspreadsheet_urlในIMPORTRANGEความหวังว่าในแต่ละครั้งหน้าจะมีการรีเฟรช, Google คิดว่าจะต้องมีการดึงข้อมูลจากสเปรดชีตใหม่ ฉันเพียงแค่เพิ่มการประทับเวลาใหม่เพื่อทำให้ URL ไม่ซ้ำกันในแต่ละครั้ง มันเป็นการแฮ็กที่โจ่งแจ้ง แต่มันได้ผลสำหรับฉันในหลาย ๆ แผ่น

สูตรของฉันก่อนหน้านี้ดูเหมือน:

=IMPORTRANGE("https://docs.google.com/spreadsheets/d/123123123123/edit#gid=1816927174","'Sheet1'!A1:B25")

และตอนนี้ดูเหมือนว่า:

=IMPORTRANGE("https://docs.google.com/spreadsheets/d/123123123123/edit#gid=1816927174"&"?"&now(),"'Sheet1'!A1:B25")

ปรับปรุง:

วิธีการนี้จะไม่ทำงานเนื่องจาก Google ไม่อนุญาตให้ภายในnow() importrange()ดูความคิดเห็นจากฮิวจ์ด้านล่าง


6
ฉันเจอคำตอบนี้เมื่อพยายามทำสิ่งเดียวกัน ดูเหมือนว่า Google ได้สร้างขึ้นมาเพื่อที่จะไม่สามารถใช้ตอนนี้ (), rand () และ randbetween () ในการโทรระหว่างการนำเข้า ()
ฮิวจ์

หากฉันตั้งค่าสเปรดชีตให้อัปเดตทุกนาทีสูตรจะได้รับการฟื้นฟูและดึงข้อมูลใหม่ (ถ้ามี) หรือไม่
Nikhil Sahu

5

ข้อมูลต่อไปนี้มาจาก Jimmy ในคำตอบ Web Appsนี้

  1. ในสเปรดชีตทั้งสองแทรก=now()สมการในเซลล์สุ่มพูดZ1
  2. ในสเปรดชีตทั้งสองแทรก=importrange()ฟังก์ชันที่อ้างอิงnowฟังก์ชันของสเปรดชีตอื่น
  3. เข้าสู่การตั้งค่าสเปรดชีตของคุณและเลือกที่จะคำนวณใหม่ทุกนาที

ฉันลองใช้คำแนะนำอื่น ๆ มากมายรวมถึงการใช้=now()ฟังก์ชั่นเคล็ดลับ URL ในตอนนี้ในเธรดนี้หรือ Apps Script เพื่อแทรกข้อความแบบสุ่มในช่วงเวลาที่กำหนด แต่ไม่มีอะไรบังคับให้การนำเข้าอัปเดตเพื่ออัปเดต


ทำงานให้ฉันในเดือนธันวาคม 2018
MalcolmOcean

4

ผมพบว่าวิธีที่ง่ายที่สุดคือการใส่ง่ายๆงบรอบifimportrange

B1 = Sheet ID
B2 = Sheet Name and Range
B3 = Now()
=if (B3> now()-1, IMPORTRANGE(B1,B2),)

ใช้ได้ผลทุกครั้ง


ฉันพยายามใช้โซลูชันของคุณ แต่ก็ไม่ชัดเจนว่าจะใช้ B3 อย่างไร คุณกำลังพูดว่า B3 = ตอนนี้ () จากนั้น=if (Now() > now()-1, IMPORTRANGE(B1,B2),)
Eugene van der Merwe

3

วิธีแก้ปัญหา datestamp ไม่ได้ผลสำหรับฉัน - มีข้อสังเกตชัดเจนว่าไม่อนุญาตให้ใช้ฟังก์ชั่น datestamps และ rand

วิธีแก้ปัญหาที่แฮ็คมากของฉันคือการลบเซลล์แล้วกด ctrl + z มันบังคับให้รีเฟรชทุกครั้ง มันเป็นเรื่องเล็กน้อยที่จะเขียนสคริปต์ onopen นี้หรือในช่วงเวลาที่กำหนดเพื่อให้ข้อมูลสด


2

ฉันพบแฮ็คง่ายๆเพื่อจำลองการปรับปรุงเซลล์ด้วยตนเองและเปิดใช้การแก้ไขในสเปรดชีตภายนอก

  1. สร้างฟังก์ชั่นที่กำหนดเองเช่นนี้:

    // Hack function used just to simulate a manual update
    function hack(value) {
      var list = []
      list.push(value);
      return list;
    }
    
  2. จากนั้นในแผ่นงานของฉันฉันเรียกมันด้วยวิธีนี้:

    =arrayformula(hack(tab!B1))
    

    ที่tab!B1เป็นหนึ่งในเซลล์ที่ผมปรับเปลี่ยนตามรหัส


สิ่งนี้จำลองการปรับปรุงเซลล์ด้วยตนเองได้อย่างไร
2560

2

หรือ ... คุณสามารถเขียนสคริปต์อย่างง่าย ๆ ก่อนอื่นให้ค่า cero (0) จากนั้นรวมสูตรกลับมาและทำเคล็ดลับ:

  var cell = sheet.getRange("B1:B1"); //SHEET TO INSERT VALUE
  cell.setFormula("=0");
   Utilities.sleep(2000); //JUST TO GIVE TIME TO UPDATE (OPTIONAL)
  var cell = sheet.getRange("B1:B1");
  cell.setFormula("=ImportRange(\"YOUR_SHEET_ID\",\"RANGE_TO_INSERT\")");  

cell.setFormula จะดียิ่งขึ้น ("=" & cell.getValue ()) ;, ดังนั้นผู้ใช้จะไม่เห็นศูนย์เป็นเวลา 2 วินาที ....
Tony BenBrahim

1

ฉันสามารถหาวิธีในการแก้ปัญหาของฉัน (รายละเอียด ที่นี่ ) โดยใช้ Apps Script พร้อมฟังก์ชันที่กำหนดเอง

หากคุณแทนที่=IMPORTRANGE(spreadsheet_url, range_string)สเปรดชีตด้วย=DynamicImportRange(spreadsheet_url, sheet_name, range)และวางรหัสด้านล่างลงในเครื่องมือ -> ตัวแก้ไขสคริปต์ -> โครงการเปล่าควรทำงาน (ดูที่นี่สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเขียนสคริปต์แอป)

/**
Usage: =DynamicImportRange(spreadsheet_url, sheet_name, range)
Compare to: =IMPORTRANGE(spreadsheet_url, range_string)

Where the given arguments are placeholders that should be replaced
by arguments specific to your use-case.
 */
function DynamicImportRange(sheet_url, sheet_name, sheet_range) {
  var values = SpreadsheetApp.openByUrl(sheet_url).getSheetByName(sheet_name).getRange(sheet_range).getValues();
  return values
};

/**
*/
function RefreshSheet() {
  // Update the following two variables to suit your particular situation
  var sheet_name = "sample_sheet_sheet"
  var range = "A1"

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheet_name);
  var formula1 = "Loading...";
  var formula2 = sheet.getRange(range).getFormula().toString().replace('"', '\"');
  // The following assumes that the data is being inserted into the sheet in the same
  // location as it is in in the source sheet.
  var form_range = formula2.split(",")[2].split("\"")[1];
  sheet.getRange(form_range).clear();
  sheet.getRange(range).setValue(formula1);
  Utilities.sleep(245);
  sheet.getRange(range).setValue(formula2);
};

หากคุณต้องการให้มีการอัปเดตชีตเป็นประจำคุณสามารถตั้งค่าทริกเกอร์โดยไปที่แหล่งข้อมูล -> ทริกเกอร์ของโครงการปัจจุบันในหน้าต่างสคริปต์แอป


4
FOR ALL ชาว Google จบลงที่นี่ : ฟังก์ชั่นสเปรดชีทที่กำหนดเองไม่สามารถเปิด (อีกต่อไป) สเปรดชีตอื่น ๆ ที่ใช้หรือSpreadsheetApp.openById() SpreadsheetApp.openByUrl()ตรวจสอบที่นี่และที่นี่
Francesco Vadicamo

1

เพื่อเป็นการแก้ปัญหาสำหรับnow()สิ่งกีดขวางคุณสามารถเปลี่ยนการตั้งค่าของสเปรดชีตเพื่ออัปเดตทุกชั่วโมง

ไฟล์ -> การตั้งค่าสเปรดชีต -> การคำนวณ

อัปเดตชีตเพื่อคำนวณใหม่ใน "การเปลี่ยนแปลงและทุกชั่วโมง " หรือ "การเปลี่ยนแปลงและทุกนาที" แม้ว่าโปรดทราบว่าการเลือกคำนวณใหม่ทุกนาทีอาจวางสเปรดชีตไว้


0

คุณสามารถใช้ Google ชีท Add-on Sheetgoเพื่ออัปเดตข้อมูลอ้างอิงของคุณจากชีตอื่นโดยอัตโนมัติ คุณสามารถใช้การอัปเดต 30 ครั้งต่อเดือนหรือรับการสมัครสมาชิกแบบชำระเงินสำหรับการอัปเดตเพิ่มเติม วิดีโอนี้ควรอธิบายการใช้งานเบื้องต้นให้คุณ


2
กรุณาเก็บไว้ในใจว่าถึงแม้มันจะระบุไว้อย่างชาญฉลาดในเว็บไซต์ " ติดตั้งฟรี " มันเป็น add-on กับหนึ่งในแผน จำกัด ฟรีตามด้วย3 คนจ่าย ลิงค์ไปยังหน้าการกำหนดราคานั้นอยู่ที่ด้านล่างสุดของเว็บไซต์เท่านั้น
marikamitsos
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.